sp_getapplock (Transact-SQL)

blokada są umieszczane na zasób aplikacji.

Topic link iconKonwencje składni języka Transact-SQL

sp_getapplock [ @Resource = ] 'resource_name', 
     [ @LockMode = ] 'lock_mode' 
     [ , [ @LockOwner = ] 'lock_owner' ] 
     [ , [ @LockTimeout = ] 'value' ]
     [ , [ @DbPrincipal = ] 'database_principal' ]
[ ; ]

Argumenty

  • [ @Resource = ] 'resource_name'
    Czy ciąg znaków określający nazwę, która identyfikuje zasób blokada.Aplikacja musi upewnij się, że nazwa zasób jest unikatowa.The specified name is hashed internally into a value that can be stored in the SQL Server lock manager.resource_name is nvarchar(255) with no default.Jeśli ciąg zasób jest dłuższa niż nvarchar(255), zostanie obcięty do nvarchar(255).

    resource_name jest binarnych w porównaniu i w ten sposób jest uwzględniana wielkość liter, niezależnie od ustawienia sortowanie bieżącej bazy danych.

    Uwaga

    Po blokada aplikacji został nabyty, tylko pierwszych 32 znaki mogą być pobierane w formacie zwykłego tekstu; reszta będzie być mieszany.

  • [ @LockMode = ] 'lock_mode'
    Is the lock mode to be obtained for a particular resource.lock_mode is nvarchar(32) and has no default value.Wartość może być dowolną z następujących czynności: Udostępnione, Aktualizacja, IntentShared, IntentExclusive, or Wyłączne.

  • [ @LockOwner = ] 'lock_owner'
    Is the owner of the lock, which is the lock_owner value when the lock was requested.lock_owner is nvarchar(32).Wartość może być Transakcja (ustawienie domyślne) lub Sesja.Gdy lock_owner wartość jest Transakcja, domyślnie lub określone jawnie, sp_getapplock muszą być wykonywane w programie, w obrębie transakcji.

  • [ @LockTimeout = ] 'value'
    Jest to wartość limit czas blokada (w milisekundach).Wartością domyślną jest taka sama jak wartość zwracana przez @@ LOCK_TIMEOUT.Aby wskazać, że żądanie blokada zwracają błąd zamiast oczekiwanie na blokadę podczas żądania nie można udzielić natychmiast, określić 0.

  • [ @DbPrincipal = ] 'database_principal'
    Jest to użytkownik, rola lub rola aplikacji, która ma uprawnienia do obiektu w bazie danych.Obiekt wywołujący funkcji musi być element członkowski z database_principal, dbo, or the db_owner ustalić rola bazy danych, aby wywołać funkcja pomyślnie.Wartością domyślną jest publiczny.

Wartości kodów powrotnych

>= 0 (sukces) lub < 0 (brak)

Wartość

Wynik

0

Blokada pomyślnie przyznano synchronicznie.

1

Blokada została udzielona pomyślnie po odczekaniu innych niezgodne blokad do zwolnienia.

-1

Upłynął limit czasu żądania blokada.

-2

Żądanie blokada zostało anulowane.

-3

Żądania blokada został wybrany jako ofiara zakleszczenie.

-999

Wskazuje, czy inny błąd wywołania poprawność parametrów.

Remarks

Blokad umieszczonych w zasobie są skojarzone z bieżącą transakcją lub w bieżącej sesja.Blokady skojarzonych z bieżącą transakcją są zwalniane po transakcji zatwierdza lub toczy się ponownie.Blokady skojarzonych z sesja są zwalniane po zarejestrowaniu do sesja.Kiedy serwer kończy pracę z jakiegoś powodu, wszystkie blokady są zwalniane.

Utworzone przez zasób blokada sp_getapplock jest tworzony w bieżącej bazie danych w sesja.Każdy zasób blokada jest identyfikowany za pomocą połączonych wartości:

  • Identyfikator bazy danych zawierającą zasób blokada bazy danych.

  • Określone w zasadzie bazy danych @ DbPrincipal parametr.

  • Blokada nazwa określona w @ zasób parametr.

Tylko członkowie określonych w głównej bazie danych @ DbPrincipal parametr można uzyskać blokady aplikacji, określające tego podmiotu.Członkowie dbo and db_owner role niejawnie są traktowane jako członków wszystkie role.

Blokady może być jawnie zwolnione z sp_releaseapplock.Gdy aplikacja wywołuje sp_getapplock wiele razy dla tego samego zasób blokada sp_releaseapplock należy wywołać tę samą liczbę razy, aby zwolnić blokadę.

Jeśli sp_getapplock nazywa się wiele razy dla tego samego zasobu blokada, ale tryb blokada, który jest określony w którymkolwiek z żądania nie jest taka sama, jak tryb istniejących, wpływ na zasób jest związek z dwóch trybów blokada.W większości przypadków oznacza tryb blokada jest podnoszony do im silniejsze trybów blokada, tryb istniejących lub nowo żądany tryb.Ten tryb blokada silniejsze są przechowywane aż do chwili blokada ostatecznie zwolnienia nawet wtedy, gdy wywołania zwolnienia blokada miały miejsce przed tym terminem.Na przykład w następującej sekwencji wywołania tego zasób jest przechowywana w Exclusive Tryb zamiast w Shared tryb.

USE AdventureWorks;
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 blokada aplikacji nie wycofać transakcji, który zażądał blokada aplikacji.Wszelkie wycofywania, które mogą być wymagane od zwracanej wartości muszą być wykonywane ręcznie.W związku z tym zaleca się, że sprawdzanie błędów być uwzględniane w kodzie, tak że jeśli niektóre wartości są zwracane (na przykład, -3), ROLLBACK TRANSACTION lub alternatywnych akcja jest inicjowane.

Oto przykład:

USE AdventureWorks;
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 Server Identyfikator bieżącej bazy danych używa do skorzystania z zasób.Dlatego jeśli sp_getapplock zostanie wykonany, nawet w przypadku parametru identyczne wartości w różnych bazach danych, to wynik jest oddzielne blokad oddzielnych zasobów.

Użycie sys.dm_tran_locks dynamicznego zarządzania widoku lub sp_lock systemu przechowywana procedura pozwala zbadać informacji blokada lub użyj SQL Server Profiler Aby monitorować blokad.

Uprawnienia

Członkostwo w grupie wymaga publiczne roli.

Przykłady

W poniższym przykładzie blokada udostępnionego, który jest skojarzony z bieżącą transakcją, są umieszczane na zasób Form1 w AdventureWorks Baza danych.

USE AdventureWorks;
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łówna baza danych.

EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'AdventureWorks', 
     @LockMode = 'Shared';
GO