Приложение падает с ошибкой deadlock detected, хотя ни один запрос по отдельности не завис — просто одна из двух параллельных транзакций внезапно получила отказ и откатилась. Первая реакция — искать баг в коде: где-то забыли COMMIT, где-то бесконечный цикл. На деле это не баг, а штатная работа базы: она обнаружила, что две транзакции никогда не смогут закончиться сами, и принудительно освободила одну из них. Разберём, как возникает такой тупик, как СУБД его ловит и почему один из участников обязан быть принесён в жертву.
Подробнее →