Есть ли способ установить lock_timeout на уровне базы данных или строки подключения?

В SQL 2005/2008 есть ли способ установить значения lock_timeout по умолчанию.

Все на уровне сервера, базы данных или строки подключения было бы здорово.


person Scott Weinstein    schedule 21.12.2009    source источник
comment
Это попытка вслепую, но вы уверены, что хотите изменить (понизить?) время ожидания блокировки, а не, скажем, разрешить чтение зафиксированного снимка в базе данных?   -  person Remus Rusanu    schedule 22.12.2009
comment
Это довольно большое изменение — я просто пытаюсь поймать редкий тупик в нашей пакетной обработке.   -  person Scott Weinstein    schedule 22.12.2009


Ответы (2)


Вы не можете установить тайм-аут блокировки в строке подключения, AFAIK. Только с SET LOCK_TIMEOUT.

Но, конечно, установка "CommandTimeout" позволит добиться довольно почти такой же результат для каждого соединения.

Существует также параметр ожидания запроса на уровне сервера, установленный sp_configure, но я им не пользовался.

person gbn    schedule 22.12.2009

Тайм-аут блокировки, т. е. количество времени, в течение которого транзакция будет ожидать блокировки, прежде чем произойдет сбой, обычно является настройкой «уровня приложения», устанавливаемой командой SET LOCK_TIMEOUT сразу после открытия соединения.

В соответствии с этой страницей драйвера JDBC также существует настройка строки подключения lockTimeout, который может быть тем, что вы ищете, но я не пробовал его для ODBC:

Количество миллисекунд ожидания, прежде чем база данных сообщит о тайм-ауте блокировки. Поведение по умолчанию — бесконечное ожидание. Если он указан, это значение используется по умолчанию для всех операторов соединения. Обратите внимание, что Statement.setQueryTimeout() можно использовать для установки времени ожидания для определенных операторов. Значение может быть 0, что означает отсутствие ожидания.

person doza    schedule 21.12.2009
comment
У меня есть база данных BI с множеством приложений, подключающихся к БД. Установить его на клиенте выполнимо, но очень некрасиво. - person Scott Weinstein; 22.12.2009
comment
Я слышу тебя. У нас есть аналогичное требование к безопасности, которое требует запуска некоторого кода сразу после установления соединения. Мы создали собственный поставщик базы данных SQL, который используют наши приложения, но было бы проще, если бы MS разрешила некоторый глобальный триггер, который запускается в контексте сеанса пользователя! - person doza; 22.12.2009
comment
На данный момент в Microsoft SQL Server 2014 поведение SET LOCK_TIMEOUT, по-видимому, типично для SET, но это не то, о чем говорится в документации, поскольку вы можете изменить параметр в триггере, в хранимой процедуре или в динамический SQL, но настройка действует только во время выполнения этого конкретного кода. Так что буквальный триггер в SQL этого не сделает. Кроме того, вы не можете установить это значение из переменной. (?) Это то, что я пробовал, прежде чем я попробовал динамический SQL, ударил два ;-) - person Robert Carnegie; 24.11.2020