Примусове очікування запиту в SQL Server


79

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

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

Чи можу я легко отримати блокування на рівні таблиці через T-SQL? Або мені доводиться возитися в майстрі? Або я можу легко примусити час очікування без блокування? Будь-який внесок вітається.

Відповіді:


131

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

select * from yourTable with (holdlock,tablockx)

тут ви можете заблокувати його на 5 хвилин:

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

Чи є спосіб зробити це з C # /. NET без блокування потоку, який здійснив цей виклик до SQL Server? Я намагаюся перевірити поведінку мого додатка під час отримання часу підключення. Але якщо я зателефоную цьому коду з C #, я не знаю, як запустити ще один запит, цілеспрямовано переживаючи час очікування.
Jake Smith

33

Ви можете просто сказати коду sql почекати хвилину перед поверненням:

WaitFor Delay '00:01:00'

Проголосував за простоту відповіді. Я тестував, і це працює
Мікель,

Я заповнював таблицю і створював складні рекурсивні запити, бафф, нісенітниця. Це робить трюк.
DanielV

10

З іншого боку: якщо з'єднання можна налаштувати, зменшіть час очікування рядка з'єднання до 1 секунди - це полегшить роботу. Заповніть таблицю наборами даних, і 3 інші процеси обертаються в циклі, оновлюючи фрагменти цієї таблиці транзакцією навколо циклу. Не змінюйте фактичну процедуру, що викликається програмою (введення очікування). Це робить тест інтеграції недійсним.

Але насправді, це тематичне дослідження на користь модульного тестування та введення залежностей. Деякі речі просто важко перевірити на інтеграцію. Одиничний тест + введення залежності .

  • Реальний: код, який виривається -> Час очікування бази даних (важко відтворити).
  • Рефактор: Код, який копається -> Сховище (робить доступ лише до даних) -> База даних
  • Юніт-тест: код, який копається> Макет-сховище для викидання -> нуль
  • Тепер у вас є невдалий тест на код, який вивалюється і може його виправити.

Це ін’єкція "залежності". Розробник може вводити залежність до бази даних, підмінюючи щось, що імітує поведінку залежності. Це добре зробити для всіх тестів бази даних. У будь-якому випадку, з наявним модульним тестом ви знаєте, що виправлення робить щось на зразок того, що повинно, але вам все одно потрібно інтеграційне тестування. У цьому випадку, можливо, краще зосередитись на регресії - це означає, що тестування не порушило нічого іншого, і функція все ще працює.

Ви вже створили свій патч, тому, мабуть, моя відповідь запізно.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.