हम इसे अभी क्यों नहीं आजमाते?
डेटाबेस सेट करें
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
) जबकि ताला लगाया जा रहा है।