लेन-देन अलगाव स्तर तालिका पर ताले के साथ संबंध है


105

मैंने अलगाव के 4 स्तरों के बारे में पढ़ा है:

Isolation Level       Dirty Read    Nonrepeatable Read  Phantom Read  
READ UNCOMMITTED      Permitted       Permitted           Permitted
READ COMMITTED              --        Permitted           Permitted
REPEATABLE READ             --             --             Permitted
SERIALIZABLE                --             --              --

मैं समझना चाहता हूं कि प्रत्येक लेन-देन अलगाव तालिका पर ताला लगा है

READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)

नीचे दिए गए तीन घटना है, जिसमें लेनदेन अलगाव हो सकता हैं
गंदा पढ़ें कोई लॉक -
Nonrepeatable पढ़ें - कोई गंदा पर प्रतिबद्ध डेटा ताला के रूप में पढ़ा
प्रेत पढ़ें - एसक्यूएल के ब्लॉक पर ताला (जो चयन क्वेरी का उपयोग करके चयन किया जाता है)

मैं समझना चाहता हूं कि हम इन अलगाव स्तरों को कहां परिभाषित करते हैं: केवल jdbc / हाइबरनेट स्तर पर या DB में भी

पुनश्च: मैं oracle में अलगाव के स्तर में लिंक के माध्यम से चला गया है , लेकिन वे अनाड़ी दिखते हैं और डेटाबेस विशिष्ट पर बात करते हैं


3
यह पूरी तरह से डेटाबेस पर निर्भर करता है। अलग-अलग डेटाबेस अलग-अलग स्तरों के लिए अलग-अलग एल्गोरिदम का उपयोग कर सकते हैं। कुछ MVCC (चुनिंदा प्रश्नों पर कोई लॉक नहीं) का उपयोग कर सकते हैं, कुछ सख्त 2 चरण लॉकिंग (साझा और अनन्य लॉक) का उपयोग करते हैं।
brb चाय

जवाबों:


157

मैं समझना चाहता हूं कि प्रत्येक लेन-देन अलगाव तालिका पर ताला लगा है

उदाहरण के लिए, आपके पास 3 समवर्ती प्रक्रियाएं हैं ए, बी और सी। ए लेनदेन शुरू करता है, डेटा और कमिट / रोलबैक (परिणामों के आधार पर) लिखता है। B केवल SELECTडेटा पढ़ने के लिए एक स्टेटमेंट निष्पादित करता है । C डेटा को पढ़ता और अपडेट करता है। ये सभी प्रक्रिया एक ही टेबल टी पर काम करती है।

  • पढ़ें बिना पढ़े - टेबल पर कोई ताला नहीं। आप उस पर लिखते समय तालिका में डेटा पढ़ सकते हैं। इसका मतलब है कि A डेटा लिखता है (uncommitted) और B इस uncommitted डेटा को पढ़ सकता है और इसका उपयोग कर सकता है (किसी भी उद्देश्य के लिए)। यदि A रोलबैक निष्पादित करता है, B ने अभी भी डेटा पढ़ा है और इसका उपयोग किया है। यह डेटा के साथ काम करने का सबसे तेज़ लेकिन सबसे असुरक्षित तरीका है क्योंकि शारीरिक रूप से संबंधित तालिकाओं में डेटा छेद नहीं हो सकता है (हां, दो तालिकाओं को तार्किक रूप से बनाया जा सकता है लेकिन वास्तविक दुनिया के ऐप = \) में शारीरिक रूप से संबंधित नहीं है।
  • पढ़ें प्रतिबद्ध - प्रतिबद्ध डेटा पर ताला। आप उस डेटा को पढ़ सकते हैं जो केवल प्रतिबद्ध था। इसका मतलब है कि A डेटा लिखता है और B तब तक A द्वारा सहेजे गए डेटा को नहीं पढ़ सकता, जब तक A एक कमिट नहीं करता। यहाँ समस्या यह है कि C उन डेटा को अपडेट कर सकता है जो B और B क्लाइंट पर पढ़े और उपयोग किए गए थे, उनके पास अपडेटेड डेटा नहीं होगा।
  • दोहराव पढ़ें - एसक्यूएल के एक ब्लॉक पर ताला (जो चयनित क्वेरी का उपयोग करके चुना गया है)। इसका मतलब है कि बी कुछ डेटा के तहत डेटा को पढ़ता है WHERE aField > 10 AND aField < 20, यानी , एक इंसर्ट डेटा जहां aFieldमूल्य 10 और 20 के बीच है, तो बी डेटा को फिर से पढ़ता है और एक अलग परिणाम प्राप्त करता है।
  • अनुक्रमिक - एक पूर्ण टेबल पर ताला (जिस पर चयन क्वेरी निकाल दिया गया है)। इसका मतलब है, बी डेटा को पढ़ता है और कोई अन्य लेनदेन तालिका पर डेटा को संशोधित नहीं कर सकता है । यह डेटा के साथ काम करने का सबसे सुरक्षित लेकिन सबसे धीमा तरीका है। इसके अलावा, चूंकि एक साधारण रीड ऑपरेशन टेबल को लॉक करता है , इससे उत्पादन पर भारी समस्याएं हो सकती हैं: कल्पना करें कि टी टेबल एक इनवॉइस टेबल है, उपयोगकर्ता एक्स दिन का चालान जानना चाहता है और उपयोगकर्ता वाई एक नया चालान बनाना चाहता है, इसलिए जबकि एक्स चालान के पढ़ने को निष्पादित करता है, Y एक नया चालान नहीं जोड़ सकता है (और जब यह पैसे के बारे में है, तो लोग वास्तव में पागल हो जाते हैं, विशेष रूप से बॉस)।

मैं समझना चाहता हूं कि हम इन अलगाव स्तरों को कहां परिभाषित करते हैं: केवल JDBC / हाइबरनेट स्तर पर या DB में भी

JDBC का उपयोग करके, आप इसका उपयोग करके परिभाषित करते हैं Connection#setTransactionIsolation

सीतनिद्रा में होना:

<property name="hibernate.connection.isolation">2</property>

कहाँ पे

  • 1: READ UNCOMMITTED
  • 2: पढ़ें गए
  • 4: पुनरावृत्ति पढ़ें
  • 8: अनुक्रमिक

हाइबरनेट कॉन्फ़िगरेशन यहां से लिया गया है (क्षमा करें, यह स्पेनिश में है)।

वैसे, आप RDBMS पर अलगाव स्तर भी सेट कर सकते हैं:

और पर और पर...


docs.oracle.com/cd/B12037_01/server.101/b10743/consist.htm ओरेकल के लिए जोड़ने के लिए: एक लेन-देन की शुरुआत में इन बयानों में से किसी एक का उपयोग करके लेन-देन का अलगाव स्तर सेट कर सकते हैं: सेट करें अलगाव लेवल रीड कमिटेड; सेट परिवहन अलगाव स्तर अनुक्रमिक; सेट परिवहन केवल पढ़ें;
शिक्षार्थी

2
इसके अलावा, SET परिवहन कथन के साथ प्रत्येक लेनदेन की शुरुआत की नेटवर्किंग और प्रसंस्करण लागत को बचाने के लिए, आप बाद के सभी लेन-देन के लिए लेन-देन अलगाव स्तर सेट करने के लिए ALTER SESSION स्टेटमेंट का उपयोग कर सकते हैं: ALTER SESSION SET ISOLATION_LEV SERIALIZABLE; अलग सत्र सेट करें / पढ़ें आगे पढ़ें;
शिक्षार्थी

12
READATABLE READ के बारे में - मुझे लगता है कि इसे प्रदर्शित करने के लिए एक बेहतर उदाहरण निम्नानुसार है: B एक लेन-देन शुरू करता है, sql के ब्लॉक पर डेटा पढ़ें कहां aField> 10 और aField <20, यह डेटा लेन-देन समाप्त होने तक लॉक रहता है। A उस डेटा को अपडेट करने की कोशिश करता है लेकिन लॉक के कारण प्रतीक्षा करता है। अब जब B उस डेटा को फिर से उसी लेन-देन में पढ़ेगा, तो उसी डेटा को पढ़ने की गारंटी होगी, क्योंकि यह लॉक है। यदि मैं गलत हूं तो मुझे सही करों।
बोर्नटोडकोड

1
@LuiggiMendoza सामान्य अवधारणा के रूप में, अलगाव स्तर केवल डर्टी रीड , गैर-दोहराने योग्य पढ़ें और प्रेत पंक्तियों के बारे में हैं । ताले (S2PL) या MVCC विभिन्न विक्रेताओं के लिए कार्यान्वयन हैं।
brb चाय

4
@LuiggiMendoza - मैं सटीक नहीं था, यह इस तरह होना चाहिए - बी पढ़ा हुआ डेटा नहीं बदला गया है, लेकिन परिणामस्वरूप बी द्वारा किए गए चयन अधिक पंक्तियों को वापस कर सकते हैं। ऐसा इसलिए है क्योंकि A उन पंक्तियों को संशोधित नहीं कर सकता है जो B पहले से ही पढ़ चुकी हैं , जब तक A उन्हें जारी नहीं करता। हालाँकि A नई पंक्तियों को सम्मिलित कर सकता है जो उस स्थिति को योग्य बनाते हैं (और इसलिए अगली बार A ऐसे किसी चयन का निष्पादन करेगा जो अधिक पंक्तियों के साथ एक अलग परिणाम प्राप्त करेगा - एक प्रेत पाठ)।
बॉर्नटूकोड

9

जैसा कि ब्रब टी कहते हैं, डेटाबेस कार्यान्वयन और उनके द्वारा उपयोग किए जाने वाले एल्गोरिदम पर निर्भर करता है: एमवीसीसी या दो चरण लॉकिंग।

CUBRID (खुला स्रोत RDBMS) इस दो एल्गोरिदम के विचार की व्याख्या करता है:

  • दो-चरण लॉकिंग (2PL)

पहला ऐसा तब है जब T2 लेनदेन A रिकॉर्ड को बदलने का प्रयास करता है, यह जानता है कि T1 लेनदेन ने पहले से ही A रिकॉर्ड बदल दिया है और T1 लेनदेन पूरा होने तक इंतजार करता है क्योंकि T2 लेनदेन यह नहीं जान सकता है कि T1 लेनदेन प्रतिबद्ध है या लुढ़का हुआ है वापस। इस विधि को दो-चरण लॉकिंग (2PL) कहा जाता है।

  • बहु-संस्करण संगामिति नियंत्रण (MVCC)

अन्य को उनमें से प्रत्येक, टी 1 और टी 2 लेनदेन की अनुमति है, अपने स्वयं के परिवर्तित संस्करण हैं। यहां तक ​​कि जब T1 लेनदेन ने A रिकॉर्ड को 1 से 2 में बदल दिया है, तब भी T1 लेनदेन मूल मूल्य 1 को छोड़ देता है और लिखता है कि A रिकॉर्ड का T1 लेनदेन संस्करण 2 है। फिर, निम्नलिखित T2 लेनदेन A रिकॉर्ड को बदलता है 1 से 3 तक, 2 से 4 तक नहीं, और लिखते हैं कि A रिकॉर्ड का T2 लेनदेन संस्करण 3 है।

जब T1 लेनदेन वापस ले लिया जाता है, तो इससे कोई फर्क नहीं पड़ता कि 2, T1 लेनदेन संस्करण, A रिकॉर्ड पर लागू नहीं है। उसके बाद, यदि T2 लेनदेन प्रतिबद्ध है, तो 3, T2 लेनदेन संस्करण, A रिकॉर्ड पर लागू किया जाएगा। यदि T1 लेनदेन T2 लेनदेन से पहले किया जाता है, तो A रिकॉर्ड 2 में बदल जाता है, और फिर T2 लेनदेन करने के समय 3 हो जाता है। अंतिम लेनदेन की स्थिति प्रत्येक लेनदेन को स्वतंत्र रूप से निष्पादित करने की स्थिति के समान है, अन्य लेनदेन पर किसी भी प्रभाव के बिना। इसलिए, यह ACID संपत्ति को संतुष्ट करता है। इस विधि को मल्टी-वर्जन कंसीलर कंट्रोल (MVCC) कहा जाता है।

MVCC मेमोरी में बढ़े हुए ओवरहेड की कीमत पर समवर्ती संशोधनों की अनुमति देता है (क्योंकि इसमें एक ही डेटा के विभिन्न संस्करणों को बनाए रखना पड़ता है) और गणना (REPETEABLE_READ स्तर में) आप अपडेट को ढीला नहीं कर सकते हैं, इसलिए इसे हाइबरेट जैसे डेटा के संस्करणों की जांच करनी चाहिए ऑप्टिमिस्टिक लॉकिंग के साथ करता है )।

2PL में लेन-देन अलगाव स्तर निम्न को नियंत्रित करते हैं :

  • क्या डेटा पढ़े जाने पर ताले लगे होते हैं, और किस प्रकार के ताले का अनुरोध किया जाता है।

  • पढ़े हुए ताले कितने समय तक लगे रहते हैं।

  • एक अन्य ऑपरेशन द्वारा संशोधित पंक्तियों को संदर्भित करते हुए रीड ऑपरेशन:

    • तब तक ब्लॉक करें जब तक कि पंक्ति पर अनन्य लॉक को मुक्त न कर दिया जाए।

    • कथन या लेन-देन शुरू होने के समय मौजूद पंक्ति के प्रतिबद्ध संस्करण को पुनः प्राप्त करें।

    • बिना डेटा संशोधन को पढ़ें।

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

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

SQL सर्वर में ताले और अलगाव के स्तर के बीच संबंध के ठोस उदाहरण (READ_COMMITTED_SNAPSHOT = ON के साथ READ_COMMITED पर छोड़कर 2PL का उपयोग करें)

  • READ_UNCOMMITED: वर्तमान लेनदेन द्वारा पढ़े गए डेटा को संशोधित करने से अन्य लेनदेन को रोकने के लिए साझा किए गए ताले जारी न करें। READ UNCOMMITTED लेन-देन भी अनन्य तालों द्वारा अवरुद्ध नहीं किया जाता है जो मौजूदा लेनदेन को उन पंक्तियों को पढ़ने से रोकेंगे जो संशोधित किए गए हैं लेकिन अन्य लेनदेन द्वारा प्रतिबद्ध नहीं हैं। [...]

  • READ_COMMITED:

    • यदि READ_COMMITTED_SNAPSHOT को बंद (डिफ़ॉल्ट) पर सेट किया गया है: साझा लेनदेन को संशोधित करने से अन्य लेन-देन को रोकने के लिए साझा किए गए ताले का उपयोग करता है जबकि वर्तमान लेनदेन एक रीड ऑपरेशन चला रहा है। साझा ताले अन्य लेन-देन द्वारा संशोधित पंक्तियों को पढ़ने से भी रोकते हैं जब तक कि अन्य लेनदेन पूरा न हो जाए। [...] अगली पंक्ति के संसाधित होने से पहले रो लॉक जारी किए जाते हैं। [...]
    • यदि READ_COMMITTED_SNAPSHOT चालू है, तो डेटाबेस इंजन पंक्ति विवरण का उपयोग डेटा के एक ट्रांज़ैक्चुअल रूप से सुसंगत स्नैपशॉट के साथ प्रस्तुत करने के लिए करता है क्योंकि यह कथन के प्रारंभ में मौजूद था। अन्य लेनदेन द्वारा डेटा को अपडेट से बचाने के लिए ताले का उपयोग नहीं किया जाता है।
  • REPETEABLE_READ: लेन-देन में प्रत्येक विवरण द्वारा पढ़े गए सभी डेटा पर साझा ताले लगाए जाते हैं और लेनदेन पूर्ण होने तक आयोजित किए जाते हैं।

  • अनुक्रमिक: सीमा ताले को मुख्य मूल्यों की श्रेणी में रखा जाता है जो लेनदेन में निष्पादित प्रत्येक विवरण की खोज स्थितियों से मेल खाते हैं। [...] रेंज लॉक तब तक आयोजित किए जाते हैं जब तक कि लेनदेन पूरा नहीं हो जाता।


5

ताले को हमेशा DB स्तर पर लिया जाता है: -

ओरेकल आधिकारिक दस्तावेज: - एक लेनदेन के दौरान संघर्ष से बचने के लिए, एक डीबीएमएस ताले का उपयोग करता है, दूसरों द्वारा उस डेटा तक पहुंच को अवरुद्ध करने के लिए तंत्र जो लेनदेन द्वारा एक्सेस किया जा रहा है। (ध्यान दें कि ऑटो-कमिट मोड में, जहां प्रत्येक स्टेटमेंट ट्रांजेक्शन होता है, केवल एक स्टेटमेंट के लिए ताले लगे रहते हैं।) लॉक सेट होने के बाद, यह तब तक लागू रहता है जब तक कि ट्रांजेक्शन कमिट नहीं हो जाता या वापस रोल नहीं हो जाता। उदाहरण के लिए, एक DBMS किसी तालिका की एक पंक्ति को तब तक लॉक कर सकता है जब तक कि उसके अपडेट नहीं किए गए हों। इस लॉक का प्रभाव किसी उपयोगकर्ता को एक गंदा पढ़ने से रोकने के लिए होगा, अर्थात, इसे स्थायी बनाने से पहले एक मूल्य को पढ़ना। (अपडेट किए गए मूल्य पर पहुंचना, जो कि कमिट नहीं किया गया है, एक गंदा रीड माना जाता है क्योंकि यह संभव है कि उस वैल्यू को उसके पिछले मूल्य पर वापस ले जाया जा सके। यदि आप उस वैल्यू को पढ़ते हैं जिसे बाद में वापस रोल किया जाता है, तो आपने अमान्य मान पढ़ा होगा। )

ताले कैसे सेट किए जाते हैं, इसे लेन-देन अलगाव स्तर कहा जाता है, जो बहुत सख्त पहुंच नियमों को लागू करने वाले लेन-देन का समर्थन करने वाले लेनदेन से नहीं हो सकता है।

ट्रांजेक्शन आइसोलेशन लेवल का एक उदाहरण TRANSACTION_READ_COMMITTED है, जो किसी वैल्यू को तब तक एक्सेस नहीं होने देगा, जब तक वह कमिटेड नहीं हो जाता। दूसरे शब्दों में, यदि ट्रांजेक्शन आइसोलेशन स्तर TRANSACTION_READ_COMMITTED पर सेट है, तो DBMS गंदे रीड्स को उत्पन्न नहीं होने देता है। इंटरफ़ेस कनेक्शन में पांच मान शामिल हैं जो लेनदेन अलगाव स्तरों का प्रतिनिधित्व करते हैं जो आप जेडीबीसी में उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.