2012-01-12 16 views
5

मैं docs में पढ़ें:क्या कोई लेनदेन SELECT पर भी शुरू होता है?

... के बाद से लेन-देन शुरू जब एक कर्सर एक प्रश्न पर अमल, लेकिन अंत जब COMMIT या ROLLBACK कनेक्शन वस्तु द्वारा निष्पादित किया जाता है।

import MySQLdb 

db = MySQLdb.connect(user="root", db="test") 
c = db.cursor() 
c.execute("SELECT * FROM books") 
print c.fetchall() 

मुझे लगता है कि MySQLdb क्योंकि यह जानना चाहते हैं कि एक प्रश्न केवल डाटा रीड मुश्किल है और इसे लिखने नहीं है यहां तक ​​कि उन क्वेरी के लिए डेटा (चयन) की तरह बदलाव न करें पर लेन-देन शुरू होता है,।

  1. क्या यह सच है?
  2. यदि ऐसा है, तो इसका मतलब है कि मुझे प्रत्येक क्वेरी के बाद cursor.commit() करना चाहिए, यह सुनिश्चित करने के लिए कि कोई तालिका लॉक नहीं है?
  3. अन्य मुद्दे जिनके बारे में मुझे जानकारी नहीं है?

आप की तरह

उत्तर

3

हाँ, एक SELECT बयान है अन्य इसलिए लेन-देन शुरू होता है धन्यवाद।

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM books ; 
COMMIT ; 

विस्तार में:

आप इस से बचना चाहते हैं, तो आप ऐसा ही कुछ कर सकता है

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

का कहना है कि निम्नलिखित अनुदेश पंक्तियों को संशोधित किया गया है पढ़ सकता है लेकिन यह है कि अभी तक COMMIT प्राप्त नहीं हुआ है। उस तरह के लेनदेन को अनन्य ताले नहीं मिलते हैं।

दूसरा भाग SELECT * FROM books ; स्पष्ट रूप से SQL statement है और तीसरा हिस्सा COMMIT ; लेनदेन समाप्त करता है और इसे "स्थायी" बनाता है। इन मामलों में कोई लेखन किया जाता है, तो COMMIT लेन-देन समाप्त करने के लिए केवल प्रयोग किया जाता है

+0

आप अपने उदाहरण समझाने कृपया सकते हैं, और क्यों 'commit' अभी भी आवश्यक है? – warvariuc

+0

@warwaruk: क्या यह प्रश्न अपडेट किया गया है? क्योंकि मुझे याद है कि यह अलग था। – DonCallisto

+0

नहीं, यह अपडेट नहीं किया गया था ... – warvariuc

1
  1. यह सच है लेकिन यह भी स्वत: ही, क्योंकि mysql ग्राहकों डिफ़ॉल्ट रूप से autocommit=1 के साथ शुरू प्रत्येक प्रश्न के बाद करता है

  2. आपको नहीं करना चाहिए, क्योंकि SELECT कथन निष्पादित होने के बाद किसी भी ताले को नहीं रखता है। अभ्यास में, स्पष्ट प्रतिबद्धता भी एक महत्वपूर्ण धीमी गति का कारण बन सकती है।

  3. बस उपयोगी हो सकता है: Why connection in Python's DB-API does not have "begin" operation?

+0

'autocommit = 1' पायथन' MySQLdb' के लिए सच नहीं है! आपको इसे स्पष्ट रूप से सेट करना होगा।पायथन एक ला में गलतफहमी के लिए यह एक आम स्रोत है "मैं अभी डेटा कहां डाला हूं?"। –

+1

@ ocaso-protal, hmm, true। मैं अभी भी ऐसा क्यों सोचता हूं, 'init_command' पैरामेरर सेटिंग को लंबे समय से पहले मेरी कनेक्शन सेटिंग्स से autocommit = 0 को हटा रहा था? – newtover

संबंधित मुद्दे