Jak anulować żądanie blokady aplikacji w programie SQL Server?

25

Sp_getapplock procedury przechowywanej następujące wartości powrotne:

0: Blokada została pomyślnie przyznana synchronicznie.
1: Blokada została przyznana pomyślnie po oczekiwaniu na zwolnienie innych niezgodnych blokad.
-1: Upłynął limit czasu żądania blokady.
-2: Żądanie blokady zostało anulowane.
-3: Żądanie blokady zostało wybrane jako ofiara zakleszczenia.
-999: Wskazuje sprawdzenie poprawności parametru lub inny błąd wywołania.

Piszę opakowanie do wywołania sp_getapplockw naszej warstwie dostępu do danych i chcę wiedzieć, w jakich okolicznościach można zwrócić -2, aby móc zgłosić wyjątkowy i pomocny wyjątek. Oczywiste jest, co oznaczają zwracane wartości -1 i -3, i mogę łatwo stworzyć warunki testowe, które powodują zwrócenie tych wartości. Jak udało mi się uzyskać wartość zwracaną -2?

Heinzi
źródło

Odpowiedzi:

5

Patrząc na źródło procesu sp_getapplockotoki, wszystkie zwracane wartości oprócz -999 pochodzą z podstawowej sys.xp_userlock wewnętrznej procedury składowanej. Założę się, że wewnętrzny proc zwraca -2, gdy żądanie jest anulowane przez zdarzenie uwagi (limit czasu zapytania klienta lub jawne anulowanie zapytania klienta). Jednak sp_getapplockpo anulowaniu partii żaden kolejny kod nie zostanie wykonany, w tymRETURN instrukcja. W związku z tym kod powrotu -2 może zostać zwrócony wewnętrznie, ale klient nie ma praktycznego sposobu na uzyskanie wartości.

Zakładając, że ta teoria jest poprawna, nie ma żadnej wartości w tłumaczeniu -2 na bardziej opisowy komunikat, ponieważ to klient anulował żądanie w pierwszej kolejności.

Zostawię to Paulowi, aby to potwierdzić, przechodząc przez kod silnika bazy danych SQL za pomocą debugera :-)

Dan Guzman
źródło
1

sp_getapplock tworzy blokady semaforów, a nie obiektów fizycznych (według MSDN). Blokuje inny proces tylko wtedy, gdy jest to sp_getapplock z tym samym łańcuchem i niezgodnym trybem blokady.

Tak więc żądania blokady zostaną anulowane w takich okolicznościach, jak: użytkownik z wyższymi uprawnieniami anuluje blokadę, proces serwera anuluje blokadę, użytkownik uruchamiający procedurę przechowywaną lub administrator zabije proces blokady. Twój opis może być „blokada anulowana przez system lub innego użytkownika”. Nie jestem pewien, jak określisz faktyczny proces / użytkownika, który anulował blokadę.

Ben Schmeltzer
źródło
-1

Istnieje odpowiednia procedura przechowywana blokady aplikacji Release o nazwie sp_releaseapplock.

Napisałem artykuł łudząco zatytułowany „Muteksy w SQL” tutaj na centralnym serwerze SQL na temat korzystania z tych procedur przechowywanych na przepływ aplikacji sterowania.

Toby
źródło
4
Wygląda na to, że odpowiadasz na pytanie w tytule, ale pytanie brzmi: „W jakich okolicznościach sp_getapplock zwróci -2?”
Martin Smith,
Żądanie blokady anulowane. Rzeczywiście, to dziwne. W jaki sposób proces anulowałby własne żądanie blokady, nie wiedząc, że zostało ono anulowane! Być może będziesz musiał zaakceptować fakt, że nie możesz podać znaczącego błędu innego niż podany przez MS - „Żądanie blokady zostało anulowane”.
Toby