Mysql nach update
MySQL unterstützt "for update" - Schlüsselwort. Hier ist, wie ich getestet habe, dass es funktioniert wie erwartet. Ich öffnete 2 browser-tabs und Ausführung der folgenden Befehle in einem Fenster.
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from myxml where id = 2 for update;
....
mysql> update myxml set id = 3 where id = 2 limit 1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.08 sec)
In einem anderen Fenster, begann ich, die Transaktion und versucht, eine update-Sperre auf dem gleichen Datensatz.
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from myxml where id = 2 for update;
Empty set (43.81 sec)
Wie Sie sehen können aus dem obigen Beispiel, ich konnte nicht wählen Sie den Datensatz für 43 Sekunden, als die Transaktion wurde bearbeitet von einer anderen Anwendung in das Fenster Nr. 1. Sobald die Verhandlung vorbei war, bekam ich zu wählen Sie die Aufnahme, aber da die id 2 wurde geändert-id 3, die die Transaktion ausgeführt wurde, zunächst kein Datensatz zurückgegeben wurde.
Meine Frage ist, was sind die Nachteile der Verwendung von "for update" - syntax? Wenn ich nicht einen commit für die Transaktion ausgeführt wird in Fenster 1 wird der Datensatz gesperrt werden, für immer?
Ich habe angenommen, Sie Antworten auf fast alle Fragen. Sie können es überprüfen, wenn Sie wollen. Bitte aufhören die Leute zu Fragen die Arbeit an etwas, das nicht möglich ist 🙂
InformationsquelleAutor shantanuo | 2010-12-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, wenn die Transaktion #1 ist nicht verpflichtet, diese Aufzeichnungen werden für immer blockiert, wenn die Verbindung unterbrochen wird, oder innodb entscheidet, rollback für die Transaktion aufgrund einer deadlock-Erkennung.
Ist nicht, was Sie wollen? wenn nicht, dann sind Sie nicht mit
SELECT ... FOR UPDATE
richtig. sehen http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.htmlWenn der Benutzer die Verbindung abgebrochen, so wird die Transaktion erhalten Sie automatisch zurückgerollt.
arbeiten mit Transaktionen, die Sie behandeln soll, die Tatsache, Sie haben einige Aufgaben warten. Aber Sie können ändern Sie die timeout-Dauer dev.mysql.com/doc/refman/5.0/en/...
InformationsquelleAutor The Scrum Meister