Doctrine – Deadlock exception

kolibla
Člen | 25
+
0
-

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
+
+4
-

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í.

kolibla
Člen | 25
+
0
-

Perfektní odpověď, díky.