Udostępnij za pośrednictwem


sp_getapplock (języka Transact-SQL)

Umieszcza blokada w aplikacji zasób.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

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