Настройка времени ожидания блокировки

Если экземпляр компонента Microsoft SQL Server Database Engine не может предоставить блокировку транзакции из-за того, что другая транзакция уже владеет конфликтующей блокировкой на данном ресурсе, то первая транзакция блокируется, ожидая освобождения существующей блокировки. По умолчанию не существует обязательного периода ожидания и не существует способа выяснить, заблокирован ли ресурс до блокировки ресурса, за исключением попытки доступа к данным (с потенциальной возможностью блокировки).

ПримечаниеПримечание

В SQL Server используйте динамическое административное представление sys.dm_os_waiting_tasks, чтобы определить, заблокирован ли процесс и кто его блокирует. В предыдущих версиях SQL Server используйте системную хранимую процедуру sp_who.

Параметр LOCK_TIMEOUT дает возможность приложению задать максимальное время ожидания инструкцией заблокированного ресурса. Если время ожидания инструкцией превышает значение, установленное LOCK_TIMEOUT, заблокированная инструкция автоматически отменяется и в приложение возвращается сообщение об ошибке 1222 (Lock request time-out period exceeded). Однако никакая транзакция, содержащая инструкцию, не будет откатана или отменена SQL Server. Следовательно, в приложении необходим обработчик ошибок, который может перехватить сообщение об ошибке 1222. Если приложение не перехватывает ошибку, то оно может продолжить свою работу и не будет осведомлено о том, что отдельная инструкция в транзакции была отмена. В будущем возможны ошибки, связанные с тем, что последующие инструкции в транзакции могут опираться на инструкцию, которая так и не была выполнена.

Реализация обработчика ошибок, который перехватывает сообщение об ошибке 1222, позволяет приложению обработать ситуацию, связанную с превышением времени ожидания, и предпринять повторную автоматическую передачу заблокированной инструкции или откат всей транзакции.

Чтобы определить текущую установку LOCK_TIMEOUT, выполните функцию @@LOCK_TIMEOUT:

SELECT @@lock_timeout;
GO