SELECT FOR UPDATE
ottiene un blocco esclusivo dell'intento sulla tabella prima di ottenere il blocco esclusivo sul record.
Pertanto, in questo 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`
si verifica un deadlock, poiché entrambe le transazioni contengono un IX
bloccati sul tavolo e in attesa di una X
bloccare i record.
In realtà, questo stesso scenario è descritto nel MySQL
manuale sul blocco
.
Per ovviare a questo problema, devi eliminare tutti gli indici tranne quello su cui stai cercando, ovvero lock_name
.
Basta rilasciare la chiave primaria su id
.