Как отменить запрос блокировки приложения в SQL Server?

25

Sp_getapplock процедура хранится имеет следующие возвращаемые значения:

0: блокировка была успешно предоставлена ​​синхронно.
1: Блокировка была успешно предоставлена ​​после ожидания освобождения других несовместимых блокировок.
-1: истекло время ожидания запроса на блокировку
-2: запрос на блокировку был отменен.
-3: запрос на блокировку был выбран в качестве жертвы тупика.
-999: указывает на проверку параметра или другую ошибку вызова.

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

Heinzi
источник

Ответы:

5

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

Предполагая, что эта теория верна, нет смысла переводить -2 к более описательному сообщению, поскольку именно клиент отменил запрос в первую очередь.

Я оставлю это Полу, чтобы подтвердить это, пошагово просматривая код ядра СУБД SQL с помощью отладчика :-)

Дэн Гусман
источник
1

Процедура sp_getapplock создает блокировки для семафоров, а не для физических объектов (в соответствии с MSDN). Он будет блокировать другой процесс только в том случае, если это sp_getapplock с той же строкой и несовместимым режимом блокировки.

Таким образом, запросы на блокировку будут отменены при таких обстоятельствах, как: пользователь с более высокими привилегиями отменяет блокировку, серверный процесс отменяет блокировку, пользователь, выполняющий хранимую процедуру, или администратор убивает процесс блокировки. Ваше описание может быть «блокировка отменена системой или другим пользователем». Я не уверен, как вы определите фактический процесс / пользователя, который отменил блокировку.

Бен Шмельцер
источник
-1

Существует соответствующая хранимая процедура блокировки приложения Release, которая называется sp_releaseapplock.

Я написал статью под названием смешения «Мьютексы в SQL» здесь на сервере SQL Central об использовании этих хранимых процедур для управления потоками данных.

Тоби
источник
4
Похоже, вы отвечаете на вопрос в заголовке, но на самом деле вопрос «При каких обстоятельствах sp_getapplock вернет -2?»
Мартин Смит
Запрос на блокировку отменен. Действительно, это странно. Как бы процесс отменил свой собственный запрос на блокировку, не зная, что он был отменен! Возможно, вам придется согласиться с тем, что вы не можете выдать значимую ошибку, кроме той, которую предоставляет MS - «Запрос на блокировку отменен».
Тоби