Doctrine – Deadlock exception
- kolibla
- Člen | 25
Ahoj, zdravím vás.
občas se nám stává, že aplikace padne na následující chybě:
Doctrine\DBAL\Exception\DeadlockException: An exception occurred while executing 'UPDATE ... '
V podstatě při zavolání metody flush.
Měli jste možnost někdy řešit něco podobného, případně nějaké vhodné řešení? Tohle nastane totiž i přes transakci. Používáme Doctrine.
Děkuji.
- David Matějka
- Moderator | 6445
Ahoj, na tohle jednoznačná odpověď není. Tohle se obecně děje, když máš vyšší konkurenci zápisu (tedy obvykle vyšší trafik)
v mysql se můžeš podívat na informace o posledním deadlocku
SHOW ENGINE INNODB STATUS
a třeba něco objevíš.
možných řešení je více: můžeš deadlock chytat a opakovat transakce – ať už třeba nějaké přepočty ve workeru nebo i na webu (na jednom webu máme v indexu try-catch, který zkusí znovu spustit celý request – to ale vyžaduje, aby celý request běžel v transakci a nedocházelo tam k žýdným side effectům mimo tu databázi – třeba posílání mailů). Můžeš zkusit serializovat problématické zápisy přes frontu. Možná jen někde chyběji indexy a tak nějaká transakce trvá dlouho, čímž se zvýší šance deadlocku. Může taky pomoct rozbít transakce v nějakých workerech na menší celky. A v neposlední řadě taky pomůže explicitní lockování.