लॉकिंग टेबल पंक्तियों/तालिकाओं आप बंद कर दिया है को प्रभावित करने से अन्य डीबी उपयोगकर्ताओं को रोकता है। लेकिन ताले, खुद में, यह सुनिश्चित नहीं करेंगे कि आपका तर्क एक स्थिर राज्य में आता है।
बैंकिंग प्रणाली के बारे में सोचें।जब आप ऑनलाइन बिल का भुगतान करते हैं, तो लेन-देन से कम से कम दो खाते प्रभावित होते हैं: आपका खाता, जिसमें से पैसा लिया जाता है। और रिसीवर का खाता, जिसमें पैसा स्थानांतरित किया जाता है। और बैंक का खाता, जिसमें वे खुशी से लेनदेन पर लगाई गई सभी सेवा शुल्क जमा करेंगे। यह देखते हुए (जैसा कि हर कोई इन दिनों जानता है) कि बैंकों असाधारण मूर्ख होते हैं, मान लें कि अपने सिस्टम इस तरह काम करता है:
$balance = "GET BALANCE FROM your ACCOUNT";
if ($balance < $amount_being_paid) {
charge_huge_overdraft_fees();
}
$balance = $balance - $amount_being paid;
UPDATE your ACCOUNT SET BALANCE = $balance;
$balance = "GET BALANCE FROM receiver ACCOUNT"
charge_insane_transaction_fee();
$balance = $balance + $amount_being_paid
UPDATE receiver ACCOUNT SET BALANCE = $balance
अब, कोई ताले और कोई लेनदेन के साथ, इस प्रणाली विभिन्न दौड़ की स्थिति, की सबसे बड़ी के लिए असुरक्षित है जो आपके खाते पर एकाधिक भुगतान किया जा रहा है, या रिसीवर का खाता समानांतर में किया जा रहा है। जबकि आपके कोड में आपकी शेष राशि पुनर्प्राप्त की गई है और यह big_overdraft_fees() और क्या नहीं कर रहा है, यह पूरी तरह से संभव है कि कुछ अन्य भुगतान समानांतर कोड समानांतर में चल रहे होंगे। वे आपकी शेष राशि (कहें, $ 100) प्राप्त करेंगे, अपने लेनदेन करें ($ 20 जो आप भुगतान कर रहे हैं, और $ 30 वे आपको खत्म कर रहे हैं), और अब दोनों कोड पथों में दो अलग-अलग शेष हैं: $ 80 और $ 70। आखिरी बार कौन सा खत्म होता है, इस पर निर्भर करते हुए, आप अपने खाते में उन दो शेषों में से किसी एक के साथ समाप्त हो जाएंगे, $ 50 की बजाय आपको $ 100 - $ 20 - $ 30) समाप्त होना चाहिए था। इस मामले में, "आपके पक्ष में बैंक त्रुटि"।
अब, मान लीजिए कि आप ताले का उपयोग करते हैं। आपका बिल भुगतान ($ 20) पहले पाइप को हिट करता है, इसलिए यह आपके खाते के रिकॉर्ड को जीतता है और लॉक करता है। अब आपके पास विशेष उपयोग है, और शेष राशि से $ 20 काट सकता है, और नई बैलेंस को शांति में वापस लिख सकता है ... और आपका खाता $ 80 के साथ समाप्त होने की उम्मीद है। लेकिन ... ओहह ... आप रिसीवर के खाते को अपडेट करने का प्रयास करते हैं, और यह लॉक हो गया है, और कोड की अनुमति से अधिक लॉक हो गया है, आपके लेनदेन का समय समाप्त हो रहा है ... हम बेवकूफ बैंकों से निपट रहे हैं, इसलिए उचित त्रुटि होने के बजाय हैंडलिंग, कोड सिर्फ exit()
खींचता है, और आपका $ 20 इलेक्ट्रॉनों के एक पफ में गायब हो जाता है। अब आप $ 20 से बाहर हैं, और आपको अभी भी रिसीवर को $ 20 का भुगतान है, और आपका टेलीफोन दोबारा प्राप्त हो जाता है।
तो ... लेनदेन दर्ज करें। आप एक लेनदेन शुरू करते हैं, आप अपने खाते को $ 20 डेबिट करते हैं, आप रिसीवर को $ 20 के साथ क्रेडिट करने का प्रयास करते हैं ... और कुछ फिर से उड़ाता है। लेकिन इस बार, exit()
के बजाय, कोड केवल rollback
कर सकता है, और Poof, आपका $ 20 जादुई रूप से आपके खाते में जोड़ा गया है।
अंत में, यह इस करने पर निर्भर करता:
ताले किसी भी डेटाबेस रिकॉर्ड आप के साथ काम कर रहे हैं साथ दखल देने से किसी और को रखने के लिए। लेन-देन किसी भी "बाद में" त्रुटियों को आपके द्वारा किए गए "पहले" चीजों में हस्तक्षेप करने से रोकते हैं। न तो अकेले ही गारंटी दे सकती है कि चीजें अंत में ठीक काम करती हैं। लेकिन एक साथ, वे करते हैं।
कल के पाठ में: डेडलॉक्स की जॉय।
मैं भी/अभी भी उलझन में हूँ। कहें कि रिसीवर खाते में शुरू होने के लिए $ 100 था और हम अपने खाते से $ 20 बिल भुगतान जोड़ रहे हैं। लेनदेन की मेरी समझ यह है कि जब वे शुरू होते हैं, तो किसी भी लेन-देन के संचालन में राज्य में डेटाबेस को लेनदेन की शुरुआत में देखा जाता है। यानी: जब तक हम इसे बदल नहीं देते, रिसीवर खाते में $ 100 है। तो ... जब हम $ 20 जोड़ते हैं तो हम वास्तव में $ 120 का संतुलन निर्धारित करते हैं। लेकिन क्या होता है, अगर हमारे लेनदेन के दौरान, किसी ने रिसीवर खाते को $ 0 तक निकाला? क्या यह किसी भी तरह से रोका गया है? क्या वे जादूगर रूप से $ 120 फिर से प्राप्त करते हैं? क्या ताले की जरूरत है? – Russ
हां, यही वह जगह है जहां ताले खेलते हैं। एक उचित प्रणाली रिकॉर्ड-लॉक करेगी ताकि लेनदेन प्रगति के दौरान कोई भी रिकॉर्ड अपडेट नहीं कर सके। एक पागल प्रणाली रिकॉर्ड पर बिना शर्त लॉक रखेगी ताकि कोई भी "बासी" संतुलन को पढ़ सके। –
असल में लेनदेन को अपने कोड पथ के अंदर चीजों को सुरक्षित करने के रूप में देखें। "समांतर" कोड पथों में सुरक्षित चीजें लॉक करता है। जब तक deadlocks हिट ... –