Принудительный тайм-аут запроса в SQL Server - PullRequest
74 голосов
/ 28 апреля 2009

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

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

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

Ответы [ 4 ]

120 голосов
/ 28 апреля 2009

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

select * from yourTable with (holdlock,tablockx)

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

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION
26 голосов
/ 28 апреля 2009

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

WaitFor Delay '00:01:00'
8 голосов
/ 06 мая 2009

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

Но на самом деле это тематическое исследование в пользу модульного тестирования и внедрения зависимостей. Некоторые вещи просто сложно проверить интеграцией. Модульный тест + Внедрение зависимостей .

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

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

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

5 голосов
/ 28 апреля 2009

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

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

...