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

MySQL InnoDB-Deadlock bei SELECT mit exklusiver Sperre (FÜR UPDATE)

ZUR AKTUALISIERUNG AUSWÄHLEN erhält eine beabsichtigte exklusive Sperre für die Tabelle, bevor die exklusive Sperre für den Datensatz erhalten wird.

Daher in diesem Szenario:

X1: SELECT FOR UPDATE -- holds IX, holds X on 'lock_name'
X2: SELECT FOR UPDATE -- holds IX, waits for X on 'lock_name'
X1: INSERT -- holds IX, waits for X for the gap on `id`

es kommt zu einem Deadlock, da beide Transaktionen ein IX enthalten verriegeln Sie den Tisch und warten Sie auf ein X Aufzeichnungen sperren.

Tatsächlich wird genau dieses Szenario im <-Code beschrieben>MySQL Anleitung zum Sperren .

Um dies zu umgehen, müssen Sie alle Indizes außer dem entfernen, in dem Sie suchen, also lock_name .

Legen Sie einfach den Primärschlüssel auf id ab .