Як скасувати запит на блокування програми в SQL Server?


25

Sp_getapplock процедура зберігається має наступні повернені значення:

0: Блокування було успішно надано синхронно.
1: Блокування було успішно надано після очікування звільнення інших несумісних замків.
-1: Запит блокування вичерпано.
-2: Запит блокування скасовано.
-3: Запит блокування був обраний як жертва тупика.
-999: Позначає перевірку параметрів або іншу помилку виклику.

Я пишу обгортку для виклику sp_getapplockв наш рівень доступу до даних і хочу знати, за яких обставин можна повернути -2, щоб я міг надати описовий та корисний виняток. Очевидно, що означають значення повернення -1 і -3, і я можу легко створити тестові умови, які викликають повернення цих значень. Як мені вдалося отримати зворотне значення -2?

Відповіді:


5

Дивлячись на джерело sp_getapplockPro обгортки, усі повернені значення, крім -999, походять від основної sys.xp_userlock внутрішньої збереженої процедури. Я ставлю ставку, що внутрішня протокол повертає -2, коли запит скасовується подією уваги (час очікування запиту клієнта або скасування експліцитного запиту клієнта). Однак подальший sp_getapplockкод не виконується після скасування пакету, включаючи RETURNоператор. Отже, код -2 повернення може бути повернутий внутрішньо, але клієнт не має практичного способу отримати значення.

Якщо припустити, що ця теорія є правильною, немає ніякого значення в перекладі на -2 до більш описового повідомлення, оскільки саме клієнт скасував запит в першу чергу.

Я залишу це для Павла, щоб підтвердити це, перейшовши через код двигуна бази даних SQL з налагоджувачем :-)


1

sp_getapplock створює блокування на семафорах, а не на фізичних об'єктах (за MSDN). Він заблокує інший процес, лише якщо це sp_getapplock з тією ж строкою та несумісним режимом блокування.

Отже запити блокування будуть скасовані за таких обставин, як: користувач з більш високими привілеями скасовує блокування, серверний процес скасовує блокування, користувач, що запускає збережену процедуру, або адміністратор вбиває процес блокування. У вашому описі може бути "скасовано блокування системою або іншим користувачем". Я не впевнений, як би ви визначили фактичний процес / користувача, який скасував блокування.


-1

Існує відповідна збережена процедура блокування додатків Release під назвою sp_releaseapplock.

Я написав статтю з заплутаною назвою "Mutexes in SQL" тут на SQL Server Central про використання цих збережених процедур для управління потоком додатків.


4
Схоже, ви відповідаєте на запитання в заголовку, але актуальне питання "За яких обставин повернеться_програми sp_getapplock -2"?
Мартін Сміт

Запит на блокування скасовано. Дійсно, це дивно. Як би процес скасував власний запит на блокування, не знаючи, що його скасовано! Можливо, вам доведеться погодитись, що ви не можете дати істотну помилку, крім тієї, що надається MS - "Запит блокування скасовано".
Тобі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.