0 सवाल: अपडेट के दौरान पूरे SQLite3 डेटाबेस को लॉक करना

पर बनाया गया सवाल Wed, May 8, 2019 12:00 AM

मुझे SQLite3 डेटाबेस को अपडेट करना होगा, जो एक टेबल को छोड़ देगा, इसे फिर से बनाएगा, और फिर टेबल को फिर से खोल देगा। मैं अपनी सभी अन्य प्रक्रियाओं को सुनिश्चित करना चाहता हूं जो डेटाबेस तक पहुंच के लिए संभावित खाली /लापता तालिका से तैयार होने से बचने के लिए लेनदेन के पूरा होने का इंतजार करना है।

इस बिंदु पर मेरा कोड इस तरह है:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable(key VARCHAR(256), value VARCHAR(256), PRIMARY KEY(key));
INSERT INTO "mytable" VALUES('key','value');
COMMIT

जब यह काम करता है, तो मुझे यकीन नहीं है कि मैं वास्तव में डीबी लॉक कर रहा हूं। मुझे कुछ विरोधाभासी जानकारी ऑनलाइन मिली है जिसमें 'BEGIN TRANSACTUSIVE' बनाम 'BEGIN TRANSACTION' का उल्लेख है।

क्या कोई यह समझा सकता है कि मेरे द्वारा लॉक किए जाने के दौरान मुझे कोई अन्य लेन-देन सुनिश्चित करने के लिए किस प्रकार के लेनदेन को सफल होना चाहिए?     

- 1
  1. प्रश्न बहुत व्यापक है क्योंकि उत्तर लगभग पूरी तरह से आपके विशिष्ट परिस्थितियों पर निर्भर करता है। क्या आप वाल मोड में कनेक्ट कर रहे हैं? LOCKING_MODE डिफ़ॉल्ट या अनन्य है? क्या SHARED_CACHE_MODE सक्षम है? अन्य कनेक्शनों का अलगाव स्तर "बिना पढ़ा हुआ" है या नहीं? बहुत सारे विवरण।
    2019-05-08 17: 11: 09Z
  2. मैं वास्तव में अन्य प्रक्रियाओं (वे कैसे लिखी जाती हैं) के बारे में कुछ भी नहीं जानते हैं। मैं bs कमांड लाइन से डेटाबेस को अपडेट करने की कोशिश कर रहा हूं, जो मैंने बनाया है .sql का उपयोग करके। मैं एक लापता /खाली तालिका के बारे में शिकायत नहीं करना चाहता हूं। इसलिए मैं डेटाबेस को उचित रूप से लॉक करने के लिए MY .sql फ़ाइल
    चाहता हूं
    2019-05-08 18: 08: 27Z
  3. सामान्य सेटिंग्स के साथ, ड्रॉप टेबल के लिए एक राइट लॉक हासिल किया जाएगा और कमिट तक जारी नहीं किया जाएगा। कोई अन्य कनेक्शन तब तक ताला नहीं लगा सकता है। लेकिन अगर आपके पास नियमित रूप से लिखने के ताले के लिए कई कनेक्शन हैं, तो आपको एक अलग डेटाबेस का उपयोग करना चाहिए। पाठकों के बहुत सारे और कभी-कभी लेखकों, शायद वाल मोड।
    2019-05-08 18: 54: 32Z
  4. @ Shawn - यह अपडेट बार-बार ठीक नहीं है। मुझे SQLite इंस्टॉलेशन पर नियंत्रण नहीं है (इसलिए मैं वाल मोड जैसी सेटिंग्स को संशोधित नहीं कर सकता।) इसलिए मैं उम्मीद कर रहा था कि "BEGIN TRANSACTION XXX"
    जैसे उपयोग का सरल उत्तर था
    2019-05-09 00: 12: 19Z
    0 उत्तर                              0                         
स्रोत रखा गया यहाँ