डिफ़ॉल्ट रूप से Oracle पंक्ति स्तर . का उपयोग करता है ताले।
ये ताले केवल लेखकों (अपडेट, डिलीट, इंसर्ट आदि) के लिए ब्लॉक कर रहे हैं। इसका मतलब है कि चयन हर समय काम करेगा जब कोई तालिका भारी अद्यतन, हटाएं, आदि।
उदाहरण के लिए, इस डेटा के साथ tableA(col1 number, col2 number) होने दें:
col1 | col2
1 | 10
2 | 20
3 | 30
यदि उपयोगकर्ता जॉन time1
. पर जारी करता है :
update tableA set col2=11 where col1=1;
पंक्ति 1 को लॉक कर देगा।
time2
. पर उपयोगकर्ता मार्क एक
update tableA set col2=22 where col1=2;
अपडेट काम करेगा, क्योंकि पंक्ति 2 लॉक नहीं है।
अब तालिका डेटाबेस में दिखती है:
col1 | col2
1 | 11 --locked by john
2 | 22 --locked by mark
3 | 30
मार्क टेबल के लिए है (वह बिना किसी बदलाव के बदलाव नहीं देखता)
col1 | col2
1 | 10
2 | 22
3 | 30
जॉन टेबल के लिए है:(वह बिना किसी बदलाव के बदलाव नहीं देखता)
col1 | col2
1 | 11
2 | 20
3 | 30
अगर मार्क time3
पर कोशिश करता है :
update tableA set col2=12 where col1=1;
उसका सत्र time4
. तक लटका रहेगा जब जॉन एक commit
जारी करेगा .(रोलबैक भी पंक्तियों को अनलॉक करेगा, लेकिन परिवर्तन खो जाएंगे)
तालिका है (डीबी में, समय 4 पर):
col1 | col2
1 | 11
2 | 22 --locked by mark
3 | 30
जॉन की प्रतिबद्धता के तुरंत बाद, पंक्ति 1 अनलॉक हो गई है और मार्क्स का अपडेट काम करेगा:
col1 | col2
1 | 12 --locked by mark
2 | 22 --locked by mark
3 | 30
आइए समय पर रोलबैक जारी करें5:
col1 | col2
1 | 11
2 | 20
3 | 30
सम्मिलित करने का मामला सरल है, क्योंकि सम्मिलित पंक्तियाँ लॉक हैं, लेकिन अन्य उपयोगकर्ताओं द्वारा भी नहीं देखी जाती हैं क्योंकि वे प्रतिबद्ध नहीं हैं। जब उपयोगकर्ता प्रतिबद्ध होता है, तो वह ताले भी जारी करता है, इसलिए, अन्य उपयोगकर्ता इन पंक्तियों को देख सकते हैं, उन्हें अपडेट कर सकते हैं या उन्हें हटा सकते हैं।
संपादित करें :जैसा कि जेफरी केम्प ने समझाया, जब आपके पास पीके होता है (इसे ओरेकल में एक अद्वितीय इंडेक्स के साथ कार्यान्वित किया जाता है), यदि उपयोगकर्ता समान मान डालने का प्रयास करते हैं (इसलिए, हमारे पास डुप्लिकेट होगा), लॉकिंग में होगी अनुक्रमणिका . पहला सत्र समाप्त होने तक दूसरा सत्र अवरुद्ध रहेगा क्योंकि यह उसी स्थान पर लिखने का प्रयास करता है। यदि पहला सत्र होता है, तो दूसरा प्राथमिक कुंजी उल्लंघन अपवाद को फेंक देगा और डेटाबेस को बदलने में विफल रहेगा। यदि पहला सत्र रोलबैक करता है, तो दूसरा सफल होगा (यदि कोई अन्य समस्या प्रकट नहीं होती है)।
(एनबी:उपयोगकर्ता जॉन द्वारा इस स्पष्टीकरण में मेरा मतलब उपयोगकर्ता जॉन द्वारा शुरू किया गया एक सत्र है।)