Un deadlock si verifica quando più transazioni si bloccano a vicenda. InnoDB annulla una delle transazioni coinvolte: l’applicazione deve gestire il tentativo successivo.
MySQL Error 1213 Deadlock: che cosa significa
Errore 1213 indica un ciclo di attese tra transazioni.
Procedura dettagliata
Un caso tipico: due transazioni aggiornano le stesse righe in ordine opposto. Un deadlock non indica di per sé che le tabelle siano danneggiate.
- Raccogli il messaggio e l’orario. Chiedi al gestore di esaminare LATEST DETECTED DEADLOCK nell’output di SHOW ENGINE INNODB STATUS.
- Se serve una raccolta più ampia, il gestore può valutare innodb_print_all_deadlocks per un intervallo limitato, conservando e poi ripristinando il valore precedente.
- Fai accedere alle righe e alle tabelle nello stesso ordine nelle operazioni concorrenti. Mantieni brevi le transazioni e verifica gli indici delle query interessate.
- Quando ricevi l’errore 1213, prepara un numero limitato di tentativi dell’intera transazione, con una breve attesa tra i tentativi. Non ripetere soltanto l’ultima query.
- Proteggi dagli invii duplicati le azioni esterne, come email o pagamenti: il rollback del database non annulla ciò che è già avvenuto fuori dal database.
- Verifica il comportamento sotto concorrenza in un ambiente di test, compreso il caso in cui tutti i tentativi falliscano.
Guide Xlogic correlate
- MySQL Error 1205: Lock wait timeout exceeded
- MySQL Error 1406: Data too long for column
- MySQL Error 1114: The table is full