आप सही हैं: मानक isolation level, read committed
पर, आपको लेनदेन में चयन विवरण लपेटने की आवश्यकता नहीं है। चयन कथन गंदे पढ़ने से संरक्षित किया जाएगा चाहे आप उन्हें लेनदेन में लपेटें या नहीं।
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
चयन बयान लुढ़का वापस अद्यतन नहीं पढ़ा होगा: यह कोई बात नहीं है कि वे एक सौदे में लिपटे नहीं कर रहे हैं।
आप repeatable reads की जरूरत है, एक डिफ़ॉल्ट लेनदेन में तो लपेटकर चयन में मदद नहीं करता:
connection 1: connection 2:
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction
begin
और commit
बयानों यहाँ मदद नहीं करेगा: दूसरे select
पुराने नाम पढ़ सकते हैं, या यह नया नाम पढ़ सकता है।
हालांकि, अगर आप एक उच्च अलगाव स्तर पर चलाते हैं, serializable
या repeatable read
की तरह, समूह गैर repeatable से रक्षा की जाएगी पढ़ता है:
connection 1: connection 2:
set transaction isolation level
repeatable read
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1 |
commit transaction |
|--> executed here
इस परिदृश्य में, update
पहले लेनदेन जब तक अवरुद्ध कर देगा पूरा है।
उच्च अलगाव स्तर शायद ही कभी उपयोग किया जाता है क्योंकि वे एक ही समय में डेटाबेस में काम कर सकते हैं जो लोगों की संख्या को कम करते हैं। उच्चतम स्तर पर, serializable
, एक रिपोर्टिंग क्वेरी किसी भी अद्यतन गतिविधि को रोकती है।
आपके पिछले पैराग्राफ के बारे में, ** अपडेट ब्लॉक क्यों होगा? ** क्या यह संभव नहीं है कि अद्यतन अभी भी अवरुद्ध किए बिना हो जाएगा, लेकिन पहला लेनदेन दोहराने योग्य-पढ़ा जा रहा है, फिर भी पुराने मूल्यों के साथ काम करना जारी रखेगा ? – Pacerier
@Pacerier: दोहराने योग्य-पढ़ने का कहना है कि यदि आप दो बार पढ़ते हैं, तो दूसरा पठन एक ही परिणाम देगा। ओरेकल या PostgeSQL के विपरीत, SQL सर्वर पुराने मानों को चारों ओर नहीं रखता है। आप इस व्यवहार को ['SET READ_COMMITTED_SNAPSHOT ON'] (http://msdn.microsoft.com/en-us/library/ms345124.aspx) के साथ बदल सकते हैं। – Andomar
हम्म, यह अजीब है, MySQL पर डिफ़ॉल्ट लगता है। तो एसक्यूएल सर्वर के लिए, 'read read_committed_snapshot चालू' चलाने के बाद, क्या यह कहना सही है कि "अपडेट" ** ** ** ब्लॉक नहीं होगा? – Pacerier