Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL:लेनदेन बनाम लॉकिंग टेबल्स

लॉकिंग टेबल अन्य डीबी उपयोगकर्ताओं को आपके द्वारा लॉक की गई पंक्तियों/तालिकाओं को प्रभावित करने से रोकता है। लेकिन ताले, अपने आप में, यह सुनिश्चित नहीं करेंगे कि आपका तर्क एक सुसंगत स्थिति में सामने आए।

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

$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

अब, बिना किसी ताले और बिना लेन-देन के, यह प्रणाली विभिन्न दौड़ स्थितियों के प्रति संवेदनशील है, जिनमें से सबसे बड़ा आपके खाते पर या प्राप्तकर्ता के खाते में समानांतर में कई भुगतान किए जा रहे हैं। जबकि आपके कोड ने आपकी शेष राशि को पुनः प्राप्त कर लिया है और विशाल_ओवरड्राफ्ट_फीस() और क्या नहीं कर रहा है, यह पूरी तरह से संभव है कि कुछ अन्य भुगतान समान प्रकार के कोड को समानांतर में चला रहे हों। वे आपकी शेष राशि (जैसे, $ 100) को पुनः प्राप्त करेंगे, उनके लेन-देन करें ($ 20 जो आप भुगतान कर रहे हैं, और $ 30 जो वे आपको खराब कर रहे हैं), और अब दोनों कोड पथों में दो अलग-अलग शेष हैं:$ 80 और $70. इस पर निर्भर करते हुए कि कौन सा अंतिम समाप्त होता है, आप अपने खाते में उन दो शेष राशियों में से किसी एक के साथ समाप्त हो जाएंगे, $50 के बजाय आपको ($100 - $20 - $30) के साथ समाप्त होना चाहिए था। इस मामले में, "आपके पक्ष में बैंक त्रुटि"।

अब, मान लीजिए कि आप ताले का उपयोग करते हैं। आपका बिल भुगतान ($20) पहले पाइप से टकराता है, इसलिए यह जीत जाता है और आपके खाते के रिकॉर्ड को लॉक कर देता है। अब आपके पास विशेष उपयोग है, और आप शेष राशि से $20 काट सकते हैं, और नई शेष राशि को शांति से वापस लिख सकते हैं ... और आपका खाता $80 के साथ समाप्त होता है जैसा कि अपेक्षित है। लेकिन... उह... आप रिसीवर के खाते को अपडेट करने की कोशिश करते हैं, और यह लॉक है, और कोड की अनुमति से अधिक समय तक लॉक है, आपके लेनदेन का समय समाप्त कर रहा है ... हम बेवकूफ बैंकों से निपट रहे हैं, इसलिए उचित त्रुटि होने के बजाय हैंडलिंग, कोड सिर्फ एक exit() खींचता है , और आपका $20 इलेक्ट्रॉनों के एक कश में गायब हो जाता है। अब आप $20 से बाहर हैं, और आप पर अभी भी रिसीवर को $20 का बकाया है, और आपका टेलीफ़ोन फिर से कब्जा कर लिया गया है।

तो... लेनदेन दर्ज करें। आप एक लेन-देन शुरू करते हैं, आप अपने खाते में $20 डेबिट करते हैं, आप रिसीवर को $20 के साथ क्रेडिट करने का प्रयास करते हैं ... और कुछ फिर से उड़ जाता है। लेकिन इस बार exit() के बजाय , कोड केवल rollback कर सकता है , और पूफ, आपका $20 जादुई रूप से आपके खाते में वापस जोड़ दिया गया है।

अंत में, यह इस पर उबलता है:

ताले किसी और को आपके द्वारा काम कर रहे किसी भी डेटाबेस रिकॉर्ड में हस्तक्षेप करने से रोकते हैं। लेन-देन किसी भी "बाद में" त्रुटियों को आपके द्वारा किए गए "पहले" कार्यों में हस्तक्षेप करने से रोकता है। कोई भी अकेले इस बात की गारंटी नहीं दे सकता कि चीजें अंत में ठीक होंगी। लेकिन साथ में, वे करते हैं।

कल के पाठ में:द जॉय ऑफ डेडलॉक।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टेक्स्ट फ़ील्ड के शब्द गणना आँकड़े निर्धारित करने के लिए SQL का उपयोग करना

  2. SSH टनल पर दूरस्थ MySQL सर्वर से कनेक्ट करने के लिए कार्यक्षेत्र का उपयोग करना

  3. मैं PHP में MySQL तालिका की अंतिम सम्मिलित आईडी कैसे प्राप्त करूं?

  4. MySQL में मिसिंग डेट्स कैसे भरें?

  5. MySQL में तर्कों की सूची के भीतर तर्क की स्थिति कैसे लौटाएं