Transazioni
Deadlock found when trying to get lock; try restarting transaction – MySQL 1213 / 40001
MySQL ERROR 1213 indica che due o più transazioni si sono bloccate a vicenda acquisendo lock in ordine incompatibile. InnoDB annulla una transazione per sbloccare il sistema; l'applicazione deve gestire il rollback e ritentare con cautela. La diagnosi richiede SHOW ENGINE INNODB STATUS e, per eventi frequenti, il log dei deadlock, mentre la prevenzione usa transazioni brevi e ordine coerente degli aggiornamenti.
Cosa significa questo errore?
MySQL ERROR 1213 indica che due o più transazioni si sono bloccate a vicenda acquisendo lock in ordine incompatibile. InnoDB annulla una transazione per sbloccare il sistema; l'applicazione deve gestire il rollback e ritentare con cautela. La diagnosi richiede SHOW ENGINE INNODB STATUS e, per eventi frequenti, il log dei deadlock, mentre la prevenzione usa transazioni brevi e ordine coerente degli aggiornamenti.
Messaggio originale
Deadlock found when trying to get lock; try restarting transactionContesto e parole chiave
Alias
- ER_LOCK_DEADLOCK
- SQLSTATE 40001
Messaggi alternativi
- Deadlock found when trying to get lock
Prodotti
- MySQL InnoDB
Piattaforme
- Linux
- macOS
- Windows
Parole chiave
- innodb deadlock
- mysql error 1213
- sqlstate 40001
Cause possibili
Transazioni che bloccano risorse in ordine diverso
Sessioni concorrenti aggiornano le stesse righe o tabelle seguendo sequenze opposte.
comuneDiagnosi
Ultimo deadlock InnoDB
Leggere lo stato InnoDB subito dopo l'errore e confrontare transazioni e lock coinvolti.
Come leggere il risultato. La sezione LATEST DETECTED DEADLOCK mostra le query e i lock che hanno formato il ciclo.
SHOW ENGINE INNODB STATUS\GRisoluzione
Retry dopo rollback e ordine coerente
Gestire SQLSTATE 40001 con rollback, backoff limitato e ordine uniforme delle operazioni.
- Eseguire rollback della transazione fallita.
- Ritentare solo le operazioni idempotenti.
- Uniformare l'ordine di accesso alle risorse e ridurre la durata delle transazioni.
Domande frequenti
Il deadlock significa che il database è corrotto?
No. È un conflitto temporaneo tra transazioni; InnoDB annulla una transazione, ma l'applicazione deve gestire il rollback e il retry.
Approfondimenti
- An InnoDB Deadlock Example - MySQL Reference Manual manuale_ufficiale