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

MySQL Select... per l'aggiornamento con l'indice presenta problemi di concorrenza

Da un punto di vista puramente teorico, sembra che tu non stia bloccando le righe giuste (condizione diversa nella prima istruzione rispetto all'istruzione di aggiornamento; inoltre blocchi solo una riga a causa di LIMIT 1 , mentre è possibile aggiornare più righe in seguito).

Prova questo:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[modifica]

Per quanto riguarda il motivo del tuo deadlock, questa è la probabile risposta (dal manuale ):

Senza un indice, il SELECT ... FOR UPDATE È probabile che l'istruzione blocchi l'intera tabella, mentre con un indice blocca solo alcune righe. Poiché non hai bloccato le righe giuste nella prima istruzione, durante la seconda istruzione viene acquisito un blocco aggiuntivo.

Ovviamente, un deadlock non può verificarsi se l'intera tabella è bloccata (cioè senza un indice). Un deadlock può sicuramente verificarsi nella seconda configurazione.