Warum versuchen wir es nicht einfach?
Richten Sie die Datenbank ein
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');
Starten Sie nun zwei Datenbankverbindungen
Verbindung 1
BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;
Verbindung 2
BEGIN;
Wenn MySQL alle Zeilen sperrt, wird die folgende Anweisung blockiert. Wenn nur die zurückgegebenen Zeilen gesperrt werden, sollte es nicht blockiert werden.
SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;
Und tatsächlich blockiert es.
Interessanterweise können wir auch keine Datensätze hinzufügen, die gelesen werden würden, d. H.
INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');
Blöcke auch!
Ich kann zum jetzigen Zeitpunkt nicht sicher sein, ob MySQL nur die gesamte Tabelle sperrt, wenn ein bestimmter Prozentsatz der Zeilen gesperrt ist, oder ob es wirklich intelligent ist, um sicherzustellen, dass das Ergebnis der SELECT ... FOR UPDATEAbfrage niemals durch eine andere Transaktion geändert werden kann ( mit einem INSERT,, UPDATEoder DELETE), während das Schloss gehalten wird.
all Records it has to SCAN TO FIND the SINGLE RECORDwäre so schrecklich dumm, dass ich wirklich bezweifle, dass MySQL so funktioniert. Denken Sie an den Algorithmus in der MySQL-Suchmaschine - wenn er eine Zeile sieht und weiß, dass es nicht die Zeile ist, die Sie benötigen, warum sollte er dann zusätzliche Zeit für das Setzen der Sperre aufwenden?! Ich schlage vor, dass Sie die Antwort nicht akzeptieren, damit andere MySQL-Leute dies kommentieren können