Принудительное время ожидания запроса в SQL Server
У нас была проблема с блоком кода, который плохо реагирует перед лицом медленных баз данных (он крепит кровать на тайм-аут запроса). Мы создали патч и находимся в процессе его запуска через регрессию.
мы не можем взять тайм-аут. Я открыл транзакцию из SQL Mgmt Studio и обновил каждую строку, чтобы заблокировать их, но это не приводит к таймауту вставки (что мне и нужно).
могу ли я легко получить блокировку на уровне таблицы через T-SQL? Или мне придется возиться с мастером? Или я могу легко заставить тайм-аут без блокировки? Любой входной ценится.
4 ответов:
запустите это, а затем попробуйте вставить...
select * from yourTable with (holdlock,tablockx)здесь вы можете заблокировать его на 5 минут:
BEGIN TRANSACTION SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK) WHERE 0 = 1 WAITFOR DELAY '00:05' ROLLBACK TRANSACTION
вы можете просто сказать своему sql-коду подождать минуту перед возвращением:
WaitFor Delay '00:01:00'
на стороне наконечника: если соединение настраивается, уменьшите тайм - аут строки подключения до 1 секунды-это упростит его. Заполните таблицу с кучей данных и 3 других процесса вращаются в цикле обновления кусков этой таблицы с транзакцией вокруг цикла. Не изменяют фактических процедура, вызываемая из приложения (инструкция waitfor инъекций). Это делает недействительным интеграционный тест.
но на самом деле, это исследование в пользу модульного тестирования и внедрения зависимостей. Некоторые вещи просто сложно провести интеграционный тест. Модульный тест + инъекции зависимостей.
- Real: Code that craps - > Database timeout (трудно воспроизвести).
- рефакторинг: код, который крэпс - > репозиторий (только доступ к данным) - >база данных
- модульный тест: код, который крэпс > макет репозитория to throw - > null
- теперь у вас есть неудачный тест для кода, который крэпс и может это исправить.
это инъекция "зависимости". Разработчик может ввести зависимость в базу данных, заменив что-то, что имитирует поведение зависимости. Хорошо сделать для всех тестов базы данных. В любом случае, с помощью модульного теста вы знаете, что исправление делает то, что должно, но вам все равно нужно интеграционное тестирование. В этом случае он может лучше сосредоточиться на регрессии - что означает, что тестирование ничего не сломало, и функция все еще работает.
вы уже создали свой патч, так что мой ответ слишком поздно.
проверить это сообщение в блоге. В основном SQL Server не имеет таймаутов запросов. Клиенты могут применять тайм-аут SQL, но сам механизм этого не делает.
http://blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx
Comments