2013-08-13 11 views
7

के साथ समवर्ती लेखन मैं बैच नौकरियों से परिणामों को सामान्य .db फ़ाइल में परिणाम लिखने के लिए sqlite3 पायथन मॉड्यूल का उपयोग कर रहा हूं। मैंने SQLite चुना क्योंकि कई प्रक्रियाएं एक ही समय में लिखने का प्रयास कर सकती हैं, और जैसा कि मैं समझता हूं कि SQLite को यह अच्छी तरह से संभालना चाहिए। मुझे यकीन है कि क्या होता है जब कई प्रक्रियाएं समाप्त होती हैं और एक ही समय में लिखने की कोशिश करती हैं। तो यदिsqlite3

conn = connect('test.db') 

with conn: 
    for v in xrange(10): 
     tup = (str(v), v) 
     conn.execute("insert into sometable values (?,?)", tup) 

एक बार निष्पादित करने की कई प्रक्रियाएं, तो क्या वे अपवाद फेंक देंगे? अन्य प्रक्रियाओं के लिए विनम्रता से प्रतीक्षा करें? क्या ऐसा करने का कोई बेहतर तरीका है?

+1

यह सुनिश्चित नहीं है कि यह एक डुप्लिकेट है: मैं एक विशिष्ट पायथन मॉड्यूल के व्यवहार के बारे में पूछ रहा हूं, सामान्य रूप से SQLite नहीं। – Shep

उत्तर

16

लाइब्रेरी डाटाबेस को लिखते समय प्रति प्रक्रिया लॉक करेगा और प्रत्येक प्रक्रिया लॉक को उनकी बारी प्राप्त करने के लिए रिलीज़ होने की प्रतीक्षा करेगी।

डेटाबेस को प्रतिबद्ध होने तक लिखे जाने की आवश्यकता नहीं है। आप कनेक्शन प्रबंधक (अच्छा!) के रूप में कनेक्शन का उपयोग कर रहे हैं, इसलिए आपके लूप के पूरा होने के बाद प्रतिबद्धता हो जाती है और सभी insert कथन निष्पादित किए गए हैं।

यदि आपके डेटाबेस में विशिष्टता की बाधाएं हैं, तो यह हो सकता है कि प्रतिबद्धता विफल हो क्योंकि एक प्रक्रिया पहले से ही पंक्तियों को जोड़ चुकी है जो एक और प्रक्रिया के साथ संघर्ष करती है।

+1

तो लॉक सक्षम है 'कनेक्ट' पर या जब प्रतिबद्ध होता है? – Shep

+1

लिखते समय लॉक पकड़ लिया जाता है। –

+1

@MartijnPieters ... और प्रतिबद्ध फ़ंक्शन कॉल से लौटने पर लॉक जारी किया जाता है। या मैं गलत हूँ? –

4

यदि प्रत्येक प्रक्रिया में यह ठीक से होना चाहिए तो यह ठीक है। क्या होगा कि प्रक्रिया लिखते समय डीबी, लॉक हो जाएगा, इसलिए अन्य सभी प्रक्रिया अवरुद्ध हो जाएंगी। यदि डीबी मुक्त होने की प्रतीक्षा करने के लिए टाइमआउट टाइमआउट आउट हो गया है तो वे अपवाद फेंक देंगे। समय समाप्ति कनेक्ट कॉल के माध्यम से विन्यस्त किया जा सकता:

http://docs.python.org/2/library/sqlite3.html#sqlite3.connect

यह अनुशंसित नहीं है कि आप एक साझा नेटवर्क में अपने डीबी फ़ाइल है।

अद्यतन:

तुम भी अलगाव के स्तर की जाँच कर सकते हैं: http://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.isolation_level

0

अच्छी खबर यह है कि SQLLite पुस्तकालय परोक्ष किसी लेन-देन है कि एक डेटाबेस ताले जब भी कोई DML को क्रियान्वित करने का उपयोग करता है। इसका मतलब यह है कि डेटाबेस तक अन्य समवर्ती पहुंच तब तक प्रतीक्षा करेगी जब तक कि डीएमएल अनुरोध लेनदेन को वापस/रोलिंग करके पूरा नहीं करता है। ध्यान दें कि कई प्रक्रियाएं एक ही समय में चयन कर सकती हैं।

इसके अलावा, कृपया Python SQL Lite 3.0 module को धारा 11.13.6 के तहत देखें - लेनदेन को नियंत्रित करना जो विवरण लेनदेन को नियंत्रित किया जा सकता है।