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

मैसकल अपडेट के लिए चयन करें - यह लक्ष्य पंक्तियों को लॉक नहीं कर रहा है। मैं यह कैसे सुनिश्चित करूं कि यह करता है?

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 की जांच करें और आप देखेंगे कि अद्यतन क्वेरी निष्पादित की गई थी (यदि यह समय समाप्त नहीं हुई)।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस में चेकबॉक्स मान सम्मिलित करना

  2. पीएचपी पीडीओ - बहुत अधिक कनेक्शन होने पर पासवर्ड दिखा रहा है

  3. एकल JDBC स्टेटमेंट ऑब्जेक्ट का उपयोग करके कई प्रश्नों को निष्पादित करें

  4. लेन-देन, पंक्ति-स्तरीय लॉकिंग और विदेशी कुंजियों का समर्थन करता है

  5. php (अस्पष्ट) खोज मिलान