MYSQL TABLE LOCKING IN HINDI.

हेलो दोस्तों आज के इस ब्लॉग पोस्ट(MYSQL TABLE LOCKING IN HINDI) में हम आपको MYSQL के अंतर्गत table level locking सिस्टम के बारे में बताने वाले है |

MYSQL के अंदर हम किसी टेबल पर कैसे लॉक लगा सकते है और हटा सकते है यह सब हम इस ब्लॉग में विस्तार से देखेंगे|MYSQL TABLE LOCKING IN HINDI|

इस ब्लॉग पोस्ट के जरिये आप सीखेंगे कि कैसे MYSQL locking सिस्टम का use करके अलग अलग sessions के द्वारा कैसे टेबल को access और restrict कर सकते है |MYSQL TABLE LOCKING IN HINDI|

lock एक्चुअली में एक तरह का फ्लैग होता है जो कि टेबल के साथ associate रहता है | MYSQL किसी भी एक क्लाइंट सेशन को किसी टेबल पर लॉक लगाने के लिए allow करता है…|MYSQL TABLE LOCKING IN HINDI|

.. जिससे कि उस specific पीरियड में कोई और session उस टेबल को एक्सेस न कर सके अथवा उस पर कोई अन्य operation परफॉर्म न कर सके|MYSQL TABLE LOCKING IN HINDI|

table lock in mysql in hindi
MYSQL TABLE LOCKING IN HINDI

कोई भी क्लाइंट सेशन लॉक को किसी टेबल पर सिर्फ अपने लिए लगा और हटा सकता है | जबकि वह किसी अन्य क्लाइंट सेशन के लिए किसी टेबल पर लॉक को लगा अथवा हटा नहीं सकता है |

आगे बढ़ने से पहले हम एक टेबल क्रिएट कर लेते है जिससे हम इस लॉकिंग सिस्टम को प्रक्टिकली समझ सके |

CREATE TABLE messages ( 
    id INT NOT NULL AUTO_INCREMENT, 
    message VARCHAR(100) NOT NULL, 
    PRIMARY KEY (id) 
);

MySQL LOCK TABLES STATEMENT

यह नीचे दिया स्टेटमेंट टेबल पर explicitly लॉक को apply करता है |

LOCK TABLES table_name [READ | WRITE]

इस स्टेटमेंट में आप जिस भी टेबल पर लॉक लगाना चाहते है उस टेबल का नाम आप lock TABLES कीवर्ड के बाद specify कर दीजिये| और इसके साथ ही आप लॉक का टाइप भी specify करते है जैसे कि Read अथवा Write|

MYSQL जो है वो आपको एक साथ कई सारी टेबल्स पर lock लगाने के लिए allow करता है | इसके लिए आप TABLES के नाम comma separation के साथ लिख दीजिये जैसे कि निचे दिए एक्साम्प्ले में दिखाया गया है, और फिर lock का टाइप specify कर दीजिये |

LOCK TABLES table_name1 [READ | WRITE], 
            table_name2 [READ | WRITE],
             ... ;

MySQL UNLOCK TABLES STATEMENT

किसी भी टेबल से लॉक को हटाने के लिए आप नीचे दिए गए स्टेटमेंट का उपयोग कर सकते है |

UNLOCK TABLES;

A READ lock has the following features:

किसी भी एक टेबल पर कई सारे sessions के द्वारा एक ही समय पर Read लॉक को acquire किया जा सकता है | और इसके के साथ ही दूसरे sessions इस टेबल का डाटा रीड कर सकते है वो भी बिना किसी लॉक को acquire किये|

कोई भी सेशन जो टेबल पर रीड लॉक एक्वायर करता है वो केवल टेबल के डाटा को रीड कर सकता है पर कोई भी Write ऑपरेशन नहीं कर सकता है | और दूसरे कोई सेशन भी टेबल पर Write ऑपरेशन परफॉर्म नहीं कर सकते है जब तक कि रीड लॉक रिलीज़ न हो जाये |

और अगर कोई दूसरे सेशन के द्वारा Write ऑपरेशन किया जाता है तो यह operation वेटिंग स्टेट में चला जायेगा जब तक कि टेबल से Read लॉक रिलीज़ नहीं होता है |

अगर कोई सेशन normally अथवा abnormally terminate होता है तो फिर ऐसे case में MYSQL implicitly सभी लॉक्स को रिलीज़ कर देगा| और यह feature Write लॉक के केस में भी ऐसे ही काम करता है |

चलिए इसे थोड़ा विस्तार से देखते है कि Read लॉक ऐसे scenario में कैसे काम करता है :

पहले सेशन में connection _id function की मदद से डेटाबेस से कनेक्ट होईये और करंट connection id को प्राप्त कीजिये|

SELECT CONNECTION_ID();
connection id1
connection id1

इसके बाद मैसेज टेबल में नयी row को insert कीजिये|

INSERT INTO messages(message) 
VALUES('Hello');

message टेबल से डाटा को सेलेक्ट करिये |

SELECT * FROM messages;
selectresult1
selectresult1

इसके बाद message टेबल पर एक Read लॉक को एक्वायर करिये|

LOCK TABLE messages READ;

अब मैसेज टेबल में एक नयी row को insert करिये|

INSERT INTO messages(message) 
VALUES('Hi');

यहाँ पर MYSQL जो है वो नीचे दी गयी error को display करता है |

Error Code: 1099. Table 'messages' was locked with a READ lock and can't be updated.

तो इसका मतलब यह है कि एक बार किसी टेबल पर आपने Read लॉक एक्वायर कर लिए तब आप उस टेबल पर कोई भी Write ऑपरेशन परफॉर्म नहीं कर पाओगे उसी session के द्वारा|

चलिए अब रीड लॉक को किसी दूसरे session के द्वारा चेक करते है |

इसके लिए आप सबसे पहले database से reconnect होईये और फिर connection id को चेक कीजिये

SELECT CONNECTION_ID();
select connection id2
select connection id2

इसके बाद message टेबल का डाटा fetch करिये|

SELECT * FROM messages;
selectresult2
selectresult2

इसके बाद message टेबल एक नयी row insert कीजिये |

INSERT INTO messages(message) 
VALUES('Bye');

इसके बाद आप output को नीचे screen पर देख सकते है |

output1
output1

आप यहाँ पर साफ़ साफ़ देख सकते है कि सेकंड सेशन के द्वारा जो इन्सर्ट क्वेरी करी गयी है वो अभी वेटिंग स्टेट में है क्योकि फर्स्ट सेशन द्वारा already मैसेज टेबल पर Read लॉक को acquire किया गया है और उसने अभी तक lock को रिलीज़ नहीं किया है |

first सेशन के द्वारा आप show processlist statement execute करके detailed इनफार्मेशन को देख सकते हैं |

SHOW PROCESSLIST;
processlist1
processlist1

इसके बाद आप अगर आप इस Read लॉक को रिलीज़ करना चाहते है तो फिर आपको first सेशन में जाकर unlock TABLES स्टेटमेंट execute करके आप इस Read लॉक को रिलीज़ कर सकते है |

अब इसके बाद आप जो insert स्टेटमेंट second सेशन द्वारा fire किया गया था वो अब execute हो जायेगा |

और इसके बाद आप message टेबल पर select query fire करके records को चेक कर सकते है कि वो insert हुआ कि नहीं |

SELECT * FROM messages;
selectresult3
selectresult3

पर यहाँ पर हम देखते है की रिकॉर्ड इन्सर्ट हो गया है | जैसे कि आप नीचे देख सकते है |

Write Locks

A WRITE lock has the following features:

Write lock के केस में जो सेशन table पर Write lock एक्वायर करता है सिर्फ वही सेशन टेबल में रीड और Write ऑपरेशन परफॉर्म कर सकता है |

और दूसरा कोई भी session जो है वो टेबल पर Read और Write operation को परफॉर्म नहीं कर सकता है जब तक कि उस पर Write lock acquire है |

चलिए अब हम इस WRITE lock को डिटेल में समझते है |

सबसे पहले हम पहले सेशन की मदद से टेबल पर WRITE लॉक को acquire करते है |

LOCK TABLE messages WRITE;

अब हम message टेबल में एक नयी row को insert करते है |

INSERT INTO messages(message) 
VALUES('Good Moring');

और यह क्वेरी successfully execute हो जाती है जिसे आप select query को execute करके देख सकते है |

SELECT * FROM messages;
selectresult4
selectresult4

मतलब कि इस session के द्वारा lock acquire करने के बाद भी यह session table पर Read और Write दोनों ऑपरेशन perform कर पा रहा है |

चलिए अब हम दूसरे session के द्वारा इस टेबल पर Read और Write ऑपरेशन perform करके देखते है |

INSERT INTO messages(message) VALUES('Bye Bye'); SELECT * FROM messages;

और यहाँ पर हम क्या देखते है कि MYSQL ने हमारे इन statement को वेटिंग स्टेट में रखा है | इसे आप show processlist statement से चेक कर सकते है |

SHOW PROCESSLIST;
processlist2
processlist2

अब हम first सेशन के द्वारा लगाए गए lock को रिलीज़ कर देते है |

UNLOCK TABLES;

यहाँ पर आप देख सकते है कि lock हटाने के बाद ही हमारे pending operation एक्सेक्यूटे हो जाते है | जैसे कि आप नीचे देख सकते है |

outputlast
outputlast

Read vs. Write Locks

Read लॉक जो होता है वो एक shared lock है जो की Write lock को एक्वायर करने से रोकता है पर वह दूसरे Read Locks को allow करता है |

Write lock जो है वो exclusive lock है और वह किसी भी प्रकार के अन्य Locks को एक्वायर करने से रोकता है |

तो इस ब्लॉग पोस्ट(MYSQL TABLE LOCKING IN HINDI) में हमने यह जाना कि किसी भी टेबल को lock और unlock कैसे करना है जिससे कि हम sessions के द्वारा उनके access को control अथवा corporate कर सकते है |

इस ब्लॉग(MYSQL TABLE LOCKING IN HINDI) को लेकर आपके मन में कोई भी प्रश्न है तो आप हमें इस पते [email protected]पर ईमेल लिख सकते है|

आशा करता हूँ, कि आपने इस पोस्ट(MYSQL TABLE LOCKING IN HINDI) को खूब एन्जॉय किया होगा|

आप स्वतंत्रता पूर्वक अपना बहुमूल्य फीडबैक और कमेंट यहाँ पर दे सकते है|MYSQL TABLE LOCKING IN HINDI|

आपका समय शुभ हो|

Anurag

I am a blogger by passion, a software engineer by profession, a singer by consideration and rest of things that I do is for my destination.