आप सही हैं:मानक अलगाव स्तर
पर , 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
सेलेक्ट स्टेटमेंट रोल्ड-बैक अपडेट को नहीं पढ़ेगा:इससे कोई फर्क नहीं पड़ता कि वे लेन-देन में लिपटे नहीं हैं।
अगर आपको रिपीटेबल रीड्स चाहिए , फिर डिफ़ॉल्ट लेनदेन में चयन लपेटने से मदद नहीं मिलती है:
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
, समूह को गैर-दोहराए जाने योग्य पठन से सुरक्षित किया जाएगा:
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
, एक रिपोर्टिंग क्वेरी किसी भी अद्यतन गतिविधि को रोक देती है।