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

MySQL Deadlock con un inserto che solleva un trigger

Il thread 2 mantiene un blocco condiviso sulla riga nella tabella degli utenti.

Quindi il thread 1 tenta di ottenere un blocco esclusivo sulla stessa riga e va in attesa di blocco.

Ma il thread 1 non avrà un'opportunità di timeout, perché il thread 2 tenta quindi di aumentare il suo blocco a esclusivo... ma per farlo, deve attendere il thread 1, che è in attesa di blocco, ma sta aspettando thread 2.

Si stanno bloccando a vicenda.

Questo è un punto morto.

Il server seleziona una transazione da uccidere, in modo che non si blocchino a vicenda inutilmente.

Il rilevamento del deadlock consente a un thread di avere successo immediatamente a spese dell'altro. Altrimenti sarebbero entrambi bloccati in attesa che uno di loro morisse per aver aspettato troppo a lungo.

Sei in modalità autocommit, ma ovviamente ciò non significa che non sei in una transazione. Ogni query con InnoDB viene ancora gestita in una transazione, ma con autocommit, la transazione viene avviata in modo implicito quando la query inizia a essere eseguita e viene eseguito il commit implicito quando ha esito positivo.