'ERROR 1213: Deadlock found when trying to get lock; try restarting transaction' ontstaat als twee transacties op elkaar wachten. Zo lees je de deadlock en voorkom je herhaling.
Een deadlock ontstaat als transactie A een rij vasthoudt die B nodig heeft, terwijl B een rij vasthoudt die A nodig heeft. Geen van beide kan verder. InnoDB herkent dat direct, kiest één transactie als 'slachtoffer', draait die terug en geeft fout 1213.
Een enkele deadlock bij drukte is normaal en hoort de applicatie op te vangen door de transactie opnieuw te proberen. Komen ze vaak voor, dan worden rijen in verschillende volgorde vergrendeld of ontbreken er indexen.
Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.
InnoDB bewaart de laatste deadlock in de statusuitvoer, onder LATEST DETECTED DEADLOCK, met beide queries.
SHOW ENGINE INNODB STATUS\GZet tijdelijk logging aan om te zien hoe vaak het gebeurt en welke queries betrokken zijn.
SET GLOBAL innodb_print_all_deadlocks = ON;Laat alle code die meerdere rijen of tabellen wijzigt dat in dezelfde volgorde doen, bijvoorbeeld altijd op oplopend id. Dan kan de kringloop niet ontstaan.
Hoe korter een transactie en hoe minder rijen hij vergrendelt, hoe kleiner de kans. Indexen op de kolommen in WHERE helpen daarbij.
Vang fout 1213 af en voer de transactie een paar keer opnieuw uit.
<?php
for ($poging = 1; $poging <= 3; $poging++) {
try {
$pdo->beginTransaction();
// ... wijzigingen ...
$pdo->commit();
break;
} catch (PDOException $e) {
$pdo->rollBack();
if (($e->errorInfo[1] ?? 0) !== 1213 || $poging === 3) {
throw $e;
}
}
}Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.
Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.
Nee. Het is een gevolg van hoe twee transacties tegelijk werken. De database lost het op door er één af te breken.
De afgebroken transactie wordt volledig teruggedraaid. Er gaat niets half mis, maar de wijziging moet opnieuw worden uitgevoerd.
Soms vermindert READ COMMITTED het aantal locks, maar het verandert ook gedrag. Begin met volgorde, indexen en korte transacties.
Hulp nodig van een mens? Website-onderhoud · WordPress-support · Hosting en onderhoud · Alle oplossingen