sp_getapplock (języka Transact-SQL)
Umieszcza blokada w aplikacji zasób.
Składnia
sp_getapplock [ @Resource = ] 'resource_name' ,
[ @LockMode = ] 'lock_mode'
[ , [ @LockOwner = ] 'lock_owner' ]
[ , [ @LockTimeout = ] 'value' ]
[ , [ @DbPrincipal = ] 'database_principal' ]
[ ; ]
Argumenty
[ @Resource= ] 'resource_name'
To ciąg określający nazwę, która identyfikuje blokada zasób.Aplikacja musi zapewnić, że nazwa zasób jest unikatowa.Określona nazwa jest mieszany wewnętrznie do wartości, które mogą być przechowywane w SQL Server blokada manager.resource_namejest nvarchar(255)z nie domyślnych.Jeśli zasób ciąg jest dłuższy niż nvarchar(255), zostanie obcięty do nvarchar(255).resource_namejest porównanie binarne i dlatego ma przypadek-niezależnie od ustawienia sortowanie bieżącej bazy danych poufnych.
Ostrzeżenie
Po uzyskał aplikacji blokada pierwszych 32 znaki mogą być pobierane w formacie zwykłego tekstu; reszta zostanie mieszany.
[ @LockMode= ] 'lock_mode'
Jest tryb blokada otrzymanymi dla określonego zasób.lock_modejest nvarchar(32) a nie wartości domyślne.Wartość może być dowolną z następujących czynności: Shared, Update, IntentShared, IntentExclusive, or Exclusive.[ @LockOwner= ] 'lock_owner'
Jest właścicielem blokada, który jest lock_owner wartość przy wymagana była blokada .lock_owneris nvarchar(32).Wartość może być Transaction (domyślnie) lub Session.Gdy lock_owner wartość jest Transaction, poprzez domyślne lub określone jawnie, sp_getapplock muszą być wykonane z w ramach transakcji.[ @LockTimeout= ] 'value'
blokadaczas-określoną wartość w milisekundach. Wartością domyślną jest taka sama, jak wartość zwracana przez @@ LOCK_TIMEOUT.Aby wskazać żądania blokada powinien zwrócić błąd zamiast oczekiwania blokada podczas żądania nie można udzielić natychmiast, określić 0.[ @DbPrincipal= ] 'database_principal'
Jest użytkownik, rola lub rola aplikacji , która ma uprawnienia do obiektu w bazie danych.Obiekt wywołujący funkcja musi być element członkowski database_principal, dbo, lub db_owner stałej rola bazy danych do wywołania funkcja pomyślnie.Wartością domyślną jest publiczna.
Wartości kodów powrotnych
>= 0 (sukces) lub < 0 (Brak)
Wartość |
Wynik |
---|---|
0 |
blokada pomyślnie przyznano synchronicznie. |
1 |
blokada przyznano pomyślnie po odczekaniu innych zwolnienie blokad niezgodne. |
-1 |
Upłynął limit czasu żądania blokada . |
-2 |
Żądania blokada zostało anulowane. |
-3 |
Żądania blokada został wybrany jako ofiara zakleszczenie . |
-999 |
Wskazuje poprawność parametrów lub inny błąd wywołania. |
Uwagi
Blokad umieszczonych w zasób skojarzonych z bieżącej transakcji lub bieżącej sesja.Blokady skojarzonych z bieżącej transakcji są zwalniane, gdy transakcja zostanie zatwierdzona lub wycofuje.Blokady skojarzonych z sesja są zwalniane po wylogowaniu z sesja .niedziałający zwolnione są wszystkie blokady.
blokadazasób utworzone przez sp_getapplock jest tworzony w bieżącej bazie danych w sesja. Każdy blokada zasób jest identyfikowany przez połączone wartości:
Identyfikator bazy danych baza danych zawierająca blokada zasób.
Zasadą bazę danych określoną w @DbPrincipal parametru.
blokada nazwa określona w @Resource parametru.
Tylko element członkowski głównej bazy danych określonej w @DbPrincipal parametru można uzyskać blokady aplikacji, które określić tego podmiotu.Członkowie dbo i db_owner role niejawnie są uważane za członków wszystkich ról.
Blokady można wyraźnie zwolnione z sp_releaseapplock.Gdy aplikacja wywołuje sp_getapplock wiele razy dla tego samego blokada zasób sp_releaseapplock musi zostać wywołana taką samą liczbę razy, aby zwolnić blokada.
Jeśli sp_getapplock wywołana wiele razy dla tego samego blokada zasób, ale trybu blokada , określona w dowolnym żądania nie jest tym samym trybie istniejących, wpływ na zasób jest Unii dwa tryby blokada .W większości przypadków oznacza to tryb blokada jest podnoszony do silniejszego tryby blokada , tryb istniejących lub nowo żądany tryb.To silniejsze trybu blokada jest przechowywana, dopóki blokada ostatecznie jest zwalniane, nawet jeśli wystąpiły wywołań zwolnienia blokada przed upływem tego czas.Na przykład w następującej sekwencji wywołania zasób jest przechowywana w Exclusive Tryb zamiast w Shared tryb.
USE AdventureWorks2008R2;
GO
BEGIN TRANSACTION;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Shared';
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Exclusive';
EXEC @result = sp_releaseapplock @Resource = 'Form1';
COMMIT TRANSACTION;
GO
zakleszczenie z aplikacji blokada nie wycofać transakcji, który zażądał aplikacji blokada.Wycofywania, może być wymagana od zwracanej wartości, należy usunąć ręcznie.W związku z tym zaleca się, że sprawdzanie błędów uwzględnione w kodzie tak, jeśli niektóre wartości są zwracane (na przykład -3), TRANSAKCJĘ ROLLBACK lub alternatywą jest inicjowane akcja .
Oto przykład:
USE AdventureWorks2008R2;
GO
BEGIN TRANSACTION;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Exclusive';
IF @result = -3
BEGIN
ROLLBACK TRANSACTION;
END
ELSE
BEGIN
EXEC @result = sp_releaseapplock @Resource = 'Form1';
COMMIT TRANSACTION;
END;
GO
SQL ServerBieżący identyfikator bazy danych używa do skorzystania z zasób.W związku z tym jeśli sp_getapplock jest wykonywany, nawet z identycznymi wartościami parametrów w różnych bazach danych, wynik jest oddzielnym blokad w oddzielnych zasobów.
Za pomocą sys.dm_tran_locks dynamiczny widok zarządzania lub sp_lock systemu procedura składowana Aby przejrzeć informacje o blokada lub za pomocą SQL Server Profiler do monitorowania blokad.
Uprawnienia
Wymaga członkostwa w public rolę.
Przykłady
Poniższy przykład umieszcza zasóbudostępnionego blokada, który jest skojarzony z bieżącej transakcji,Form1 w AdventureWorks2008R2 bazy danych.
USE AdventureWorks2008R2;
GO
BEGIN TRAN;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Shared';
COMMIT TRAN;
GO
W następującym przykładzie określono dbo jako głównej bazy danych.
BEGIN TRAN;
EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'AdventureWorks2008R2',
@LockMode = 'Shared';
COMMIT TRAN;
GO
Zobacz także