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 .