Подтвердить что ты не робот

Принуждение таймаута запроса в SQL Server

У нас была проблема с блоком кода, который плохо реагирует перед медленными базами данных (он держит кровать за тайм-аут запроса). Мы создали патч и находимся в процессе его запуска через регрессию.

Мы не можем получить тайм-аут. Я открыл транзакцию из SQL Mgmt Studio и обновил каждую строку, чтобы заблокировать их, но это не приводит к таймауту INSERT (это то, что мне нужно).

Можно ли легко получить блокировку на уровне таблицы через T-SQL? Или мне нужно заниматься мастером? Или я могу легко заставить таймаут без блокировки? Любой вход оценивается.

4b9b3361

Ответ 1

запустите это, а затем попробуйте вставить...

select * from yourTable with (holdlock,tablockx)

здесь вы можете заблокировать его в течение 5 минут:

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

Ответ 2

Вы можете просто указать свой код sql, чтобы подождать минуту, прежде чем вернуться:

WaitFor Delay '00:01:00'

Ответ 3

На стороне наконечника: если соединение настраивается, сократите время ожидания строки подключения до 1 секунды - это упростит работу. Заполните таблицу сортами данных и попросите 3 других процесса закрутить цикл, обновляющий куски этой таблицы транзакцией вокруг цикла. Не изменяйте действительную процедуру, вызванную приложением (вводят waitfor). Это делает недействительным тест интеграции.

Но на самом деле, это пример исследования в пользу модульного тестирования и инъекции зависимостей. Некоторые вещи просто трудно интегрировать тест. Unit test + инъекция зависимостей.

  • Реальный: Код, который держит → Тайм-аут базы данных (трудно воспроизвести).
  • Рефакторинг: Код, который держит → Репозиторий (только доступ к данным) → База данных
  • Unit test: Код, который держит > Mock repository для throw → null
  • Теперь у вас есть неудачный тест для кода, который держит и может его исправить.

Это инъекция "зависимостей". Dev может вносить зависимость в базу данных, заменяя что-то, что имитирует поведение зависимости. Хорошо делать все тесты базы данных. Во всяком случае, с Unit test на месте, вы знаете, что исправление делает то, что должно, но вам все равно нужно тестирование интеграции. В этом случае он может лучше сосредоточиться на регрессии, что означает, что тестирование не нарушает ничего другого, и функция все еще работает.

Вы уже создали свой патч, поэтому, я думаю, мой ответ слишком поздний.

Ответ 4

Проверьте этот пост в блоге. В основном SQL Server не имеет таймаутов запроса. Клиенты могут применять таймаут SQL, но сам движок не работает.

http://blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx