Deadlock возникает, когда две или более транзакции удерживают ресурс, который нужен друг другу, создавая циклическую зависимость, при которой ни одна из них не может продолжить работу.
READ COMMITTED вместо SERIALIZABLE, где это возможно)Большинство баз данных имеют встроенное обнаружение deadlock'ов. Когда deadlock обнаружен, движок автоматически выбирает жертву — откатывает её транзакцию и позволяет другой завершиться.
Распространённый паттерн обработки — повторно выполнить откатанную транзакцию:
-- Пример псевдокода
BEGIN TRY
BEGIN TRANSACTION
-- твои SQL операции
COMMIT
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 1205 -- код ошибки deadlock'а
-- логика повтора здесь
ROLLBACK
END CATCH
deadlock graphs в SQL Server или SHOW ENGINE INNODB STATUS в MySQL)Наиболее эффективный подход сочетает последовательный порядок доступа к ресурсам на этапе проектирования с надёжной логикой повторов на уровне приложения.
Deadlock происходит, когда одна транзакция держит несколько блокировок и не может получить дополнительную блокировку, которая ей нужна, что вызывает бесконечное блокирование всей транзакции.
Новый — ещё не проверен сообществом
Вы