SELECT FOR UPDATE
verkrijgt een intentie-exclusief slot op de tafel voorafgaand aan het verkrijgen van het exclusieve slot op het record.
Daarom, in dit scenario:
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`
er treedt een impasse op, aangezien beide transacties een IX
. bevatten slot op de tafel en wachten op een X
lock op de records.
Eigenlijk wordt dit scenario beschreven in de MySQL
handleiding over vergrendeling
.
Om dit te omzeilen, moet u alle indexen verwijderen, behalve degene waarop u zoekt, namelijk lock_name
.
Laat de primaire sleutel gewoon vallen op id
.