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