Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL InnoDB dead lock su SELECT con blocco esclusivo (FOR UPDATE)

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 .