ए SELECT FOR UPDATE
आपके द्वारा बनाए गए लेन-देन के समाप्त होने तक आपके द्वारा चयनित पंक्ति को अपडेट के लिए लॉक कर देता है। अन्य लेन-देन केवल उस पंक्ति को पढ़ सकते हैं लेकिन वे इसे तब तक अपडेट नहीं कर सकते जब तक कि अद्यतन लेनदेन के लिए चयन अभी भी खुला है।
पंक्तियों को लॉक करने के लिए:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
उपरोक्त लेन-देन जीवित रहेगा और प्रतिबद्ध होने तक पंक्ति को लॉक कर देगा।
इसका परीक्षण करने के लिए, विभिन्न तरीके हैं। मैंने दो टर्मिनल इंस्टेंस का उपयोग करके इसका परीक्षण किया जिसमें प्रत्येक में MySQL क्लाइंट खोला गया था।
first terminal
पर आप SQL चलाते हैं:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
second terminal
पर आप पंक्ति को अपडेट करने का प्रयास कर सकते हैं:
UPDATE test SET parent = 100 WHERE id = 4;
चूंकि आप first terminal
. पर अपडेट के लिए चयन बनाते हैं उपरोक्त क्वेरी तब तक प्रतीक्षा करेगी जब तक अद्यतन लेनदेन के लिए चयन नहीं किया जाता है या यह समय समाप्त हो जाएगा।
first terminal
पर वापस जाएं और लेन-देन करें:
COMMIT;
second terminal
की जांच करें और आप देखेंगे कि अद्यतन क्वेरी निष्पादित की गई थी (यदि यह समय समाप्त नहीं हुई)।