MySQL
MySQL लॉक टेबल
खोज…
वाक्य - विन्यास
लॉक टेबल टेबल_नाम [READ | लिखना]; // लॉक टेबल
अनलॉक टैब; // टेबल्स अनलॉक करें
टिप्पणियों
लॉकिंग का उपयोग कंसीडर प्रॉब्लम को हल करने के लिए किया जाता है। लेन-देन को चलाने के दौरान केवल आवश्यक है। पहले एक डेटाबेस से एक वैल्यू पढ़ें और बाद में उस वैल्यू को डेटाबेस में लिखें। सेल्फ-इन्सर्ट इन्सर्ट, अपडेट या डिलीट ऑपरेशन्स के लिए कभी भी लॉक की आवश्यकता नहीं होती है।
दो प्रकार के ताले उपलब्ध हैं
READ LOCK - जब कोई उपयोगकर्ता केवल तालिका से पढ़ रहा हो।
राइट लॉक - जब कोई उपयोगकर्ता टेबल पर पढ़ना और लिखना दोनों कर रहा होता है।
जब कोई उपयोगकर्ता किसी तालिका पर WRITE LOCK
रखता है, तो कोई अन्य उपयोगकर्ता उस तालिका को पढ़ या लिख नहीं सकता है। एक उपयोगकर्ता एक रखती है जब READ LOCK
एक मेज पर, अन्य उपयोगकर्ताओं को भी पढ़ सकते हैं या एक पकड़ READ LOCK
, लेकिन कोई उपयोगकर्ता लिख सकते हैं या एक धारण कर सकते हैं WRITE LOCK
कि मेज पर।
यदि डिफ़ॉल्ट भंडारण इंजन InnoDB है, तो MySQL स्वचालित रूप से पंक्ति स्तर लॉकिंग का उपयोग करता है, ताकि एक-दूसरे को प्रतीक्षा किए बिना, कई लेनदेन एक साथ पढ़ने और लिखने के लिए एक ही तालिका का उपयोग कर सकें।
InnoDB के अलावा सभी भंडारण इंजनों के लिए, MySQL टेबल लॉकिंग का उपयोग करता है।
टेबल लॉक के बारे में अधिक जानकारी के लिए यहां देखें
मैसकल लॉक
टेबल लॉक ENGINE=MyISAM
लिए एक महत्वपूर्ण उपकरण हो सकता है, लेकिन शायद ही कभी ENGINE=InnoDB
लिए उपयोगी हो। यदि आप InnoDB के साथ टेबल लॉक का उपयोग करने के लिए लुभाए जाते हैं, तो आपको इस बात पर पुनर्विचार करना चाहिए कि आप लेन-देन के साथ कैसे काम कर रहे हैं।
MySQL टेबल के उपयोग के लिए अन्य सत्रों के साथ सहयोग करने के उद्देश्य से टेबल लॉक्स को स्पष्ट रूप से प्राप्त करने के लिए क्लाइंट सत्रों को सक्षम करता है, या जब सत्र को उनके लिए विशेष पहुंच की आवश्यकता होती है, तो अन्य सत्रों को तालिकाओं को संशोधित करने से रोकने के लिए। एक सत्र केवल स्वयं के लिए ताले प्राप्त या जारी कर सकता है। एक सत्र दूसरे सत्र के लिए तालों का अधिग्रहण नहीं कर सकता है या दूसरे सत्र के लिए जारी किए गए ताले जारी नहीं कर सकता है।
लेन-देन का अनुकरण करने या तालिकाओं को अपडेट करते समय अधिक गति प्राप्त करने के लिए ताले का उपयोग किया जा सकता है। इस अनुभाग में बाद में इसे और अधिक विस्तार से समझाया गया है।
कमांड: LOCK TABLES table_name READ|WRITE;
आप केवल एक टेबल पर लॉक टाइप असाइन कर सकते हैं;
उदाहरण (पढ़ें ताला):
LOCK TABLES table_name READ;
उदाहरण (राइट लॉक):
LOCK TABLES table_name WRITE;
यह देखने के लिए कि लॉक लागू है या नहीं, कमांड का उपयोग करें
SHOW OPEN TABLES;
सभी तालों को फ्लश / निकालने के लिए, निम्नलिखित कमांड का उपयोग करें:
UNLOCK TABLES;
उदाहरण:
LOCK TABLES products WRITE:
INSERT INTO products(id,product_name) SELECT id,old_product_name FROM old_products;
UNLOCK TABLES;
उदाहरण के ऊपर कोई भी बाहरी कनेक्शन तालिका उत्पाद को अनलॉक करने तक उत्पाद तालिका में कोई डेटा नहीं लिख सकता है
उदाहरण:
LOCK TABLES products READ:
INSERT INTO products(id,product_name) SELECT id,old_product_name FROM old_products;
UNLOCK TABLES;
ऊपर के उदाहरण से कोई भी बाहरी कनेक्शन तालिका उत्पाद को अनलॉक करने तक उत्पाद तालिका से कोई डेटा नहीं पढ़ सकता है
पंक्ति स्तर लॉकिंग
यदि तालिकाएँ InnoDB का उपयोग करती हैं, तो MySQL स्वचालित रूप से पंक्ति स्तर लॉकिंग का उपयोग करता है ताकि एक-दूसरे को प्रतीक्षा किए बिना, कई लेनदेन एक साथ पढ़ने और लिखने के लिए एक ही तालिका का उपयोग कर सकें।
यदि दो लेन-देन एक ही पंक्ति को संशोधित करने की कोशिश कर रहे हैं और दोनों पंक्ति स्तर लॉकिंग का उपयोग करते हैं, तो एक लेनदेन दूसरे के पूरा होने की प्रतीक्षा करता है।
पंक्ति स्तर लॉकिंग को भी संशोधित करके अपेक्षित होने वाली प्रत्येक पंक्तियों के SELECT ... FOR UPDATE
का SELECT ... FOR UPDATE
करके प्राप्त किया जा सकता है।
रो स्तर को विस्तार से समझाने के लिए दो कनेक्शनों पर विचार करें
कनेक्शन 1
START TRANSACTION;
SELECT ledgerAmount FROM accDetails WHERE id = 1 FOR UPDATE;
कनेक्शन 1 में, सेलेक्ट लेवल लॉक को SELECT ... FOR UPDATE
स्टेटमेंट।
कनेक्शन 2
UPDATE accDetails SET ledgerAmount = ledgerAmount + 500 WHERE id=1;
जब कोई कनेक्शन 2 में एक ही पंक्ति को अपडेट करने का प्रयास करता है, तो वह कनेक्शन 1 को समाप्त करने के लिए प्रतीक्षा करेगा लेन-देन या त्रुटि संदेश innodb_lock_wait_timeout
सेटिंग के अनुसार प्रदर्शित किया जाएगा, जो कि 50 सेकंड तक innodb_lock_wait_timeout
।
Error Code: 1205. Lock wait timeout exceeded; try restarting transaction
इस लॉक के बारे में विवरण देखने के लिए, SHOW ENGINE INNODB STATUS
---TRANSACTION 1973004, ACTIVE 7 sec updating
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)
MySQL thread id 4, OS thread handle 0x7f996beac700, query id 30 localhost root update
UPDATE accDetails SET ledgerAmount = ledgerAmount + 500 WHERE id=1
------- TRX HAS BEEN WAITING 7 SEC FOR THIS LOCK TO BE GRANTED:
कनेक्शन 2
UPDATE accDetails SET ledgerAmount = ledgerAmount + 250 WHERE id=2;
1 row(s) affected
लेकिन कनेक्शन 2 में कुछ अन्य पंक्ति को अपडेट करते समय बिना किसी त्रुटि के निष्पादित किया जाएगा।
कनेक्शन 1
UPDATE accDetails SET ledgerAmount = ledgerAmount + 750 WHERE id=1;
COMMIT;
1 row(s) affected
अब पंक्ति लॉक जारी किया गया है, क्योंकि लेन-देन कनेक्शन 1 में शुरू किया गया है।
कनेक्शन 2
UPDATE accDetails SET ledgerAmount = ledgerAmount + 500 WHERE id=1;
1 row(s) affected
लेन-देन समाप्त करके कनेक्शन 1 जारी पंक्ति लॉक के बाद कनेक्शन 2 में किसी भी त्रुटि के बिना अपडेट निष्पादित किया जाता है।