Источник: SQL Exercises
Тупик - это состояние, когда два (или больше) процесса пытаются обратиться к ресурсу, который заблокирован другим процессом. Поскольку каждый процесс запрашивает ресурс другого процесса, ни один из них не может быть завершен. Когда SQL Server обнаруживает тупик, он откатывает транзакцию, которая имеет наименьшую продолжительность обработки и возвращает в приложение сообщение об ошибке 1205. Сообщение об ошибке 1205 прерывает выполнение текущего пакета и откатывает текущую транзакцию.
Детали
В некоторых случаях состояние тупика будет вызывать команду библиотеки DB-Library (DB-Lib) типа dbsqlexec, dbsqlok или dbresults, чтобы вернуть FAIL (сбой). Программа всегда ответственна за проверку кодов возврата из каждой команды DB-Lib. Если одна из этих команд DB-Lib возвращает FAIL, программа должна отменить выполнение пакета, а не попытаться его продолжить. В некоторых случаях возможно продолжение выполнения последующих команд в пакете. Однако поскольку произошла тупиковая ситуация, и для команды, которая ее вызвала, был выполнен откат, последующие команды в пакете будут, вероятно, вызывать более серьезные ошибки, например, "объект не
В других случаях состояние тупика не будет заставлять команду DB-Lib возвращать FAIL. Чтобы обработать такую ситуацию, программа должна проверить сообщение 1205 в обработчике сообщений и использовать функцию dbsetuserdata, чтобы сообщить об этом вашему приложению (пример может быть найден в Главе 4 "DB-Library Functions" справочника программиста С в пункте dbsetuserdata). Таким образом, программа должна проверять индикатор тупика после каждого вызова DB-Library и отменять выполнение пакета в случае обнаружения тупика.
Хотя может показаться необязательной отмена пакета после получения сообщения о тупике 1205, это необходимо, потому что сервер не всегда прерывает выполнение пакета в тупиковой ситуации. Если выполнение пакета не отменено, любая другая попытка принять новый пакет может привести к ошибке DB-Library 10038 "Results Pending" (задержка результатов).
Вы можете найти описание проблемы тупика и пример того, как обнаружить состояние тупика в Приложении E "Максимизирование согласованности и параллелизма" в "Справочнике программиста C" SQL Server для Windows NT
Применимо к
- Microsoft SQL Server 4.21a Standard Edition
- Microsoft SQL Server 2000 Standard Edition
- Microsoft SQL Server 2005 Standard Edition
- Microsoft SQL Server 2005 Developer Edition
- Microsoft SQL Server 2005 Enterprise Edition
- Microsoft SQL Server 2005 Express Edition
- Microsoft SQL Server 2005 Workgroup Edition
Microsoft Corp (оригинал: Description of handling deadlock conditions in SQL Server)
Перевод: Моисеенко С.И.
Оригинал перевода