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

MySQL के FOR UPDATE लॉकिंग का उपयोग करते समय, वास्तव में क्या लॉक है?

हम इसे अभी क्यों नहीं आजमाते?

डेटाबेस सेट करें

CREATE DATABASE so1;
USE so1;
CREATE TABLE notification (`id` BIGINT(20), `date` DATE, `text` TEXT) ENGINE=InnoDB;
INSERT INTO notification(id, `date`, `text`) values (1, '2011-05-01', 'Notification 1');
INSERT INTO notification(id, `date`, `text`) values (2, '2011-05-02', 'Notification 2');
INSERT INTO notification(id, `date`, `text`) values (3, '2011-05-03', 'Notification 3');
INSERT INTO notification(id, `date`, `text`) values (4, '2011-05-04', 'Notification 4');
INSERT INTO notification(id, `date`, `text`) values (5, '2011-05-05', 'Notification 5');

अब, दो डेटाबेस कनेक्शन प्रारंभ करें

कनेक्शन 1

BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;

कनेक्शन 2

BEGIN;

यदि MySQL सभी पंक्तियों को लॉक कर देता है, तो निम्न कथन अवरुद्ध हो जाएगा। यदि यह केवल उन पंक्तियों को लॉक करता है जो इसे लौटाती हैं, तो इसे अवरुद्ध नहीं करना चाहिए।

SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;

और वास्तव में यह ब्लॉक करता है।

दिलचस्प बात यह है कि हम ऐसे रिकॉर्ड भी नहीं जोड़ सकते जिन्हें पढ़ा जाएगा, यानी

INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');

ब्लॉक भी!

मैं इस बिंदु पर निश्चित नहीं हो सकता कि क्या MySQL आगे बढ़ता है और पूरी तालिका को लॉक करता है जब पंक्तियों का एक निश्चित प्रतिशत लॉक हो जाता है, या जहां यह वास्तव में यह सुनिश्चित करने में वास्तव में बुद्धिमान है कि SELECT ... FOR UPDATE क्वेरी को किसी अन्य लेनदेन द्वारा कभी नहीं बदला जा सकता है (INSERT . के साथ) , UPDATE , या DELETE ) जबकि ताला लगाया जा रहा है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql त्रुटि 150 - विदेशी कुंजियाँ

  2. tomcat 6.0.24 अपवाद:com.mysql.jdbc.SQLError लोड नहीं हो सका

  3. क्या मैं MySQL में एक ट्रिगर घोषणा में एकाधिक ईवेंट परिभाषित कर सकता हूं?

  4. डेटा आयात करें। एसक्यूएल MySQL डॉकर कंटेनर

  5. SQL को SQL कीमिया में बदलें