मैं SQLite डेटाबेस ताले को कैसे रोकूं?


11

SQLite FAQ से मैंने जाना कि:

एकाधिक प्रक्रियाओं में एक ही समय में एक ही डेटाबेस खुला हो सकता है। एक SELECTही समय में कई प्रक्रियाएं की जा सकती हैं । लेकिन केवल एक प्रक्रिया किसी भी समय डेटाबेस में परिवर्तन कर सकती है, हालाँकि।

तो, जहाँ तक मैं समझता हूँ के रूप में मैं कर सकते हैं: 1) एक से अधिक थ्रेड से db पढ़ें ( SELECT) 2) एक से अधिक थ्रेड से db पढ़ें ( SELECTएकल थ्रेड से) और लिखने ( CREATE, INSERT, DELETE)

लेकिन, मैं राइट-अहेड लॉगिंग के बारे में पढ़ता हूं जो अधिक संगामिति प्रदान करता है क्योंकि पाठक लेखकों को ब्लॉक नहीं करते हैं और एक लेखक पाठकों को ब्लॉक नहीं करता है । पढ़ना और लिखना समवर्ती रूप से आगे बढ़ सकता है।

अंत में, मैं पूरी तरह से गड़बड़ हो गया हूं जब मैंने इसे पाया , जब निर्दिष्ट किया गया था:

SQLITE_LOCKED त्रुटि प्राप्त करने के अन्य कारण इस प्रकार हैं:

  • की कोशिश CREATEया DROPएक मेज या सूचकांक, जबकि एक SELECTबयान अभी भी लंबित है।
  • SELECTउसी तालिका पर सक्रिय रहते हुए एक तालिका में लिखने की कोशिश की जा रही है ।
  • SELECTएक मल्टीथ्रेड एप्लिकेशन में एक ही समय में एक ही टेबल पर दो करने की कोशिश करना , अगर साइक्लाइट ऐसा करने के लिए सेट नहीं है।
  • fcntl (3, DB फाइल पर F_SETLK कॉल विफल रहता है। यह एक NFS लॉकिंग समस्या के कारण हो सकता है। उदाहरण के लिए, इस समस्या का एक समाधान, DB को mv दूर करना है, और इसे वापस कॉपी करना है ताकि इसका नया इनोड मान हो।

तो, मैं अपने लिए स्पष्ट करना चाहूंगा, ताला से बचना आवश्यक है? क्या मैं एक ही समय में दो अलग-अलग धागों से पढ़ और लिख सकता हूँ? धन्यवाद।

जवाबों:


9

वह पृष्ठ जो आपने जोड़ा है, काफी पुराना होने के अलावा, उसी प्रक्रिया से उसी डेटाबेस कनेक्शन के माध्यम से एक्सेस की बात करता है (या साझा कैश मोड में मल्टीपे कनेक्शन के माध्यम से , जिसका आपको उपयोग नहीं करना चाहिए)।

जब वाल मोड में नहीं होता है, तो कई कनेक्शन एक ही डेटाबेस से पढ़ सकते हैं, लेकिन एक लेखन लेनदेन अनन्य है, अर्थात, किसी अन्य पाठक या लेखक को अनुमति नहीं है।

वाल मोड में, एक लेखक और पाठक एक-दूसरे को अवरुद्ध नहीं करते हैं, लेकिन अभी भी केवल एक लेखक की अनुमति है।


1
साझा कैश मोड में क्या गलत है? मैं एक ही प्रक्रिया में कई पायथन थ्रेड्स प्राप्त करने में सक्षम था, इसके साथ एक टेबल पर लिखने के लिए एक जॉबलेब पैरलल फॉर लूप । मैं एक सेट जब तक ताला मुद्दों था isolation_level=None। साझा कैश मोड के बिना, मैं थ्रेड्स के बीच उदाहरण कैसे साझा करूं?
जस्टिन डियरिंग

1
प्रलेखन नुकसान का वर्णन करता है। यह विशेष रूप से खतरनाक है यदि आप नहीं जानते कि गतिरोध से कैसे बचा जाए।
सीएल।

पार्टी में बहुत देर से आ रहा है, लेकिन यह लिंक उपयोगी है। manski.net/2012/10/sqlite-performance
infocyde
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.