मैं यह निर्धारित करने की कोशिश कर रहा हूं कि डेटाबेस में मेरा स्क्लाइट एक्सेस आईओएस पर थ्रेड-सुरक्षित है या नहीं। मैं एक गैर ऐप स्टोर ऐप (या संभवतः लॉन्च डिमन) लिख रहा हूं, इसलिए ऐप्पल की स्वीकृति कोई समस्या नहीं है। प्रश्न में डेटाबेस अंतर्निहित sms.db है, इसलिए यह सुनिश्चित करने के लिए कि ओएस भी इस डेटाबेस को पढ़ने और लिखने के लिए एक्सेस कर रहा है। मैं केवल इसे सुरक्षित रूप से पढ़ने में सक्षम होना चाहता हूं।इंटरप्रोसेस SQLite थ्रेड सुरक्षा (आईओएस पर)
मैं this about reading from multiple processes with sqlite पढ़ा है:
कई प्रक्रियाओं एक ही डाटाबेस एक ही समय में खुला हो सकता है। एकाधिक प्रक्रियाएं एक ही समय में एक चयन कर सकती हैं। लेकिन केवल एक प्रक्रिया समय में किसी भी समय डेटाबेस में परिवर्तन कर सकती है।
मैं समझता हूँ कि धागे की सुरक्षा SQLite से बाहर संकलित किया जा सकता है, और sqlite3_threadsafe()
इस के लिए परीक्षण करने के लिए इस्तेमाल किया जा सकता है। आईओएस 5.0.1 पर इस रनिंग
int safe = sqlite3_threadsafe();
म्युटेक्स लॉकिंग का मतलब है कि 2. According to this का एक परिणाम, पैदावार उपलब्ध है। लेकिन, इसका मतलब यह नहीं है कि यह उपयोग में है।
मैं पूरी तरह से स्पष्ट नहीं हूं कि प्रति कनेक्शन, प्रति डेटाबेस, या वैश्विक आधार पर थ्रेड-सुरक्षा गतिशील रूप से सक्षम है या नहीं।
I have also read this। ऐसा लगता है कि सुरक्षित मल्टी-थ्रेडिंग सक्षम करने के लिए sqlite3_config()
का उपयोग किया जा सकता है, लेकिन निश्चित रूप से, मेरे पास कोई नियंत्रण नहीं है, या दृश्यता है कि ओएस ने स्वयं इस कॉल का उपयोग कैसे किया हो (क्या मैं?)। अगर मैं अपने ऐप में फिर से कॉल करना चाहता था, तो क्या यह डेटाबेस को पढ़ने के लिए सुरक्षित बनाएगा, या यह मेरे ऐप में एकाधिक धागे के लिए समवर्ती पहुंच को केवल डीकॉनफ्लिक्ट करेगा जो उसी sqlite3
डेटाबेस हैंडल का उपयोग करता है?
वैसे भी, मेरे सवाल है ...
मैं सुरक्षित रूप से इस डेटाबेस भी आईओएस द्वारा पहुँचा है पढ़ सकते हैं, और यदि हां, तो कैसे?
जब आप कहते हैं "* यह अभी भी कहना चाहिए, लिखने से पहले एक अनन्य ताला लें *", क्या आपका मतलब है कि SQLite स्वचालित रूप से ऐसा करेगा मुझे? या मैं (या आईओएस एसएमएस ढांचा) इसके लिए ज़िम्मेदार हूँ? उदाहरण के लिए, क्या मुझे (या आईओएस) लिखने से पहले 'BEGIN विशेष लेनदेन; 'कथन जारी करने की आवश्यकता है? – Nate
मैंने एक संपादन जोड़ा। 'BEGIN विशिष्ट लेनदेन 'लेनदेन की शुरुआत में एक विशेष लॉक लेने के लिए है। डिफ़ॉल्ट रूप से, SQLite जितनी देर तक प्रतीक्षा कर सकता है। दस्तावेज़ों से: * ध्यान दें कि BEGIN आदेश डेटाबेस पर किसी भी ताले को प्राप्त नहीं करता है। BEGIN कमांड के बाद, जब पहला चयन कथन निष्पादित किया जाता है तो एक साझा लॉक प्राप्त किया जाएगा। एक सुरक्षित लॉक अधिग्रहित किया जाएगा जब पहला INSERT, अद्यतन, या DELETE कथन निष्पादित किया जाता है। * ... –
... * कोई विशेष लॉक तब तक हासिल नहीं किया जाता है जब तक कि स्मृति कैश भर जाती है और उसे डिस्क पर या लेनदेन तक नहीं किया जाना चाहिए करता है। इस तरह, सिस्टम अंतिम फ़ाइल के लिए फ़ाइल फ़ाइल तक पढ़ने की पहुंच को अवरुद्ध करने में देरी करता है। * यदि आप 'BEGIN ट्रांज़ेक्शन' का उपयोग नहीं करते हैं, तो भी सभी कथन एक निहित लेनदेन में हैं। –