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 दूर करना है, और इसे वापस कॉपी करना है ताकि इसका नया इनोड मान हो।
तो, मैं अपने लिए स्पष्ट करना चाहूंगा, ताला से बचना आवश्यक है? क्या मैं एक ही समय में दो अलग-अलग धागों से पढ़ और लिख सकता हूँ? धन्यवाद।
isolation_level=None
। साझा कैश मोड के बिना, मैं थ्रेड्स के बीच उदाहरण कैसे साझा करूं?