Время ожидания блокировки
Когда Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) не может заблокировать транзакцию на ресурсе, поскольку у другой транзакции на этом ресурсе уже есть конфликтующая блокировка, транзакция, которая запрашивает блокировку, блокируется, до тех пор пока другая транзакция не снимет блокировку. Эта ситуация может быть также вызвана взаимоблокировкой. По умолчанию время ожидания блокировки, установленное в SQL Server Compact Edition, равно двум секундам. Проверить, заблокирован ли ресурс, перед блокировкой фактически невозможно. Единственный способ — это обратиться к данным и выждать определенное время ожидания.
Примечание. |
---|
Чтобы определить наличие блокировки запроса и причину этой блокировки, воспользуйтесь системным представлением sys.lock_information. Дополнительные сведения см. в разделе Отображение сведений о блокировке. |
Настройка LOCK_TIMEOUT позволяет приложению установить максимальное время, в течение которого инструкция должна ожидать блокированный ресурс. Если инструкция ожидает больше времени, чем указано в настройке LOCK_TIMEOUT, заблокированная инструкция будет отменена автоматически и приложению вернется ошибка SSCE_M_LOCKTIMEOUT — "Превышено время ожидания блокировки". Однако SQL Server Compact Edition не откатит и не отменит транзакцию, содержащие инструкции. Приложению требуется обработчик ошибок, который может записать сообщение об ошибке SSCE_M_LOCKTIMEOUT. Если приложение не запишет ошибку, возможно, его работа будет продолжена так, словно отдельной инструкции с транзакцией не было потеряно. В дальнейшем это может привести к ошибкам, поскольку на эту инструкцию, которая не была исполнена, могут опереться другие инструкции.
Внедрение обработчика ошибок для записи сообщения об ошибке SSCE_M_LOCKTIMEOUT позволяет приложению по истечении времени ожидания предпринимать необходимые действия, например автоматически повторно отправлять заблокированную инструкцию или откатывать всю транзакцию.
Для установки текущей настройки LOCK_TIMEOUT для сеанса исполните синтаксис SET LOCK_TIMEOUT, как показано в следующем примере кода:
SET LOCK_TIMEOUT 2000;
См. также
Основные понятия
Основные принципы блокировки
Уровень изоляции транзакций
Подсказки блокировки (SQL Server Compact Edition)