2012-03-28 27 views
9

मान लें कि दो पायथन स्क्रिप्ट हैं जो उसी तालिका में डेटा लिखना चाहते हैं जो sqlite3 मॉड्यूल का उपयोग कर SQLite फ़ाइल में संग्रहीत है। SQLite- फ़ाइल को एनएफएस फाइल सिस्टम पर संग्रहीत किया जाता है। SQLite-FAQ में मैंने पढ़ा:एनएफएस फाइल सिस्टम पर स्क्लाइट फ़ाइल लॉक करना संभव है?

SQLite डेटाबेस तक पहुंच को नियंत्रित करने के लिए पाठक/लेखक ताले का उपयोग करता है। [...] लेकिन सावधानी बरतें: यदि यह फ़ाइल एनएफएस फाइल सिस्टम पर रखी गई है तो यह लॉकिंग तंत्र सही ढंग से काम नहीं कर सकता है। ऐसा इसलिए है क्योंकि fcntl() फ़ाइल लॉकिंग कई एनएफएस कार्यान्वयन पर टूट गई है। आपको एनएफएस पर SQLite डेटाबेस फ़ाइलों को डालने से बचें यदि एकाधिक प्रक्रिया एक ही समय में फ़ाइल तक पहुंचने का प्रयास कर सकती है।

क्या इसका मतलब यह बिल्कुल संभव नहीं है या यह सुनिश्चित करने के लिए कोई तरीका है कि एक प्रक्रिया दूसरी होने तक प्रतीक्षा करेगी?

आईएनएसईआरटी जटिल नहीं हैं। बस कुछ:

INSERT_STATEMENT = "INSERT INTO some_table (row, col, val) VALUES (?, ?, ?)" 
connection.executemany(INSERT_STATEMENT, triples) 

और सम्मिलित सेट अलग हैं।

एक और प्रश्न: क्या एनएफएस-समस्याएं तब होती हैं जब दो प्रक्रियाएं एक ही तालिका में लिखने की कोशिश करती हैं या जब वे एक ही डेटाबेस (जो एक फ़ाइल है) को लिखने का प्रयास करते हैं? क्या यह प्रत्येक प्रक्रिया को उसी डेटाबेस (फ़ाइल) में अपनी तालिका बनाने और उसे लिखने के लिए एक समाधान होगा?

उत्तर

19

एनएफएस के साथ SQLite का उपयोग न करें। यह बहुत ही सरल है। एनएफएस अर्थशास्त्र नियमित फाइल सिस्टम से अलग हैं और कमजोर हैं। आपको अंततः भ्रष्टाचार मिलेगा। प्रत्येक अब और फिर SQLite-users मेलिंग सूची पोस्ट पर उनके "वर्कअराउंड" के साथ पोस्ट करता है। वे कभी काम नहीं करते हैं हालांकि वे अल्प अवधि में दिखाई देते हैं।

+7

इस आदमी को सुनो। [वह एक अधिकार है।] (Http://code.google.com/p/apsw/) –

+1

दुर्भाग्य से मुझे SQLite का उपयोग करना होगा। मैंने लिखने के लिए प्रत्येक प्रक्रिया को अपनी फाइल देकर समाप्त कर दिया, और बाद में स्क्रिप्ट मर्ज कर दिया। लेकिन आपके उत्तर के लिए धन्यवाद! :-) – Aufwind

+4

जब आप अंततः भ्रष्टाचार प्राप्त करते हैं, तो यह सुनिश्चित करना सुनिश्चित करें कि आपने एनएफएस का उपयोग किया है। और आश्चर्यचकित न हों जब हर किसी से प्रतिक्रिया "ऐसा न करें"। –