Mysql
 sql >> Datenbank >  >> RDS >> Mysql

UPDATE mit SELECT, wird jede Zeile oder alle SELECTed Datensätze gesperrt

Das UPDATE läuft in Transaktion - es ist ein atomic -Operation, was bedeutet, dass, wenn eine der Zeilen fehlschlägt (z. B. aufgrund einer eindeutigen Einschränkung), keine der 5000 Zeilen aktualisiert wird. Dies ist eine der ACID-Eigenschaften einer Transaktionsdatenbank.

Deswegen das UPDATE Halten Sie eine Sperre für alle Zeilen für die gesamte Transaktion. Andernfalls kann eine andere Transaktion den Wert einer Zeile auf der Grundlage ihres aktuellen Werts weiter aktualisieren (sagen wir, Datensätze aktualisieren set value =value * '2'). Diese Anweisung sollte zu unterschiedlichen Ergebnissen führen, je nachdem, ob die erste Transaktion festgeschrieben oder zurückgesetzt wird. Aus diesem Grund sollte auf die erste Transaktion gewartet werden, um alle 5000 Aktualisierungen abzuschließen.

Wenn Sie die Sperren freigeben möchten, führen Sie das Update einfach in (kleineren) Stapeln durch.

P.S. autocommit steuert, ob jede Anweisung in einer eigenen Transaktion ausgegeben wird, beeinflusst aber nicht die Ausführung einer einzelnen Abfrage