2017-04-17 4 views
0

Wie wir alle wissen, Zeile (Datensatz) Sperre werden in Innodb-Engine unterstützt. Es besteht kein Zweifel, dass der folgende SQL atomare und in einer Transaktion ist.wird Mysql alle Tabelle während der Verarbeitung sperren

update tableA t 
set t.oneField = someValue 
where t.primaryKey = id 

Aber ich bin verwirrt auf die folgende Situation (ohne in dem Zustand)

update tableA t 
set t.oneField = someValue 

Was ich will, ist fragen, wird die gesamte Tabelle mysql sperren, während diese SQL-Ausführung? Spezifischer, wenn rowA verarbeitet wurde und mysql andere Zeilen verarbeitet, ist rowA noch gesperrt, während diese sql noch verarbeitet? Jedes Werkzeug oder SQL-Befehl könnte verwenden, um zu wissen, ob rowB gesperrt ist oder nicht?

Ich habe doc https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html gelesen, aber immer noch verwirrt.

Noch mehr, wenn es möglich ist, könnten Sie mir einen bestimmten Fall oder eine Demo oder ein Experiment geben, um Ihre Schlussfolgerung zu illustrieren. Etwas was ich selber machen könnte beides ok.

Vielen Dank.

+0

Was ist mit der Situation, update tableA t gesetzt t.oneField = someValue wo t.primaryKey in (1, 2, ......) – jingb

Antwort

0

Sagen, dass nicht "die Tabelle zu sperren" ist technisch korrekt. In Wirklichkeit "schließt es jede Reihe" ab. Für den Benutzer sind diese gleich.

Ihre beiden Abfragen versuchen zu laufen, aber sie werden sich bald gegenseitig stören. Wahrscheinlich wird einer verzögert, bis der andere fertig ist. In einigen Situationen wird ein "Deadlock" erkannt und eine Abfrage wird abgebrochen. (Sie müssen auf Fehler prüfen.)

Die wichtige Unterscheidung mit dem Vorgänger (ENGINE=MyISAM) ist, dass alle Operationen "die Tabelle gesperrt". Das Aktualisieren einer Zeile konnte nicht gestartet werden, bis ein separater Thread, der eine andere Zeile aktualisiert hat, beendet wurde. Und die Interferenz zwischen UPDATE und SELECT war größer.

Mit InnoDB können Aktualisierungen von separaten Zeilen gleichzeitig erfolgen, und die Auswahl kann auch während der Aktualisierungen erfolgen.

+0

** Mit InnoDB können Updates von separaten Zeilen gleichzeitig passieren, und Selects können auch sein geht weiter, während die Updates stattfinden **. Das bedeutet, dass der Innodb die Zeilen, die er verarbeitet hat, nicht sperrt, während der SQL Server noch ausgeführt wird, egal, wo er sich befindet oder nicht. – jingb

+0

@jingb - Ja, das ist eine gute Zusammenfassung. Aber ich zögere, "absolut, positiv, 100%" zu sagen - weil es seltene, verzerrte, obskure Randfälle gibt, die dazu führen können, dass etwas anderes passiert. Also, nach Fehlern suchen. InnoDB macht Dinge "optimistisch" - Konflikte sind selten; InnoDB kann die meisten von ihnen transparent handhaben; einige werden behoben, indem ein Thread verzögert wird (wiederum transparent); aber manchmal können Deadlocks passieren. –

Verwandte Themen