Sdílet prostřednictvím


sp_getapplock (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Uzavírá zámek na aplikační zdroj.

Transact-SQL konvence syntaxe

Syntaxe

sp_getapplock
    [ [ @Resource = ] N'Resource' ]
    , [ @LockMode = ] 'LockMode'
    [ , [ @LockOwner = ] 'LockOwner' ]
    [ , [ @LockTimeout = ] LockTimeout ]
    [ , [ @DbPrincipal = ] N'DbPrincipal' ]
[ ; ]

Arguments

[ @Resource = ] N'Resource'

Řetězec specifikující jméno, které identifikuje zámek zdroj. @Resource je nvarchar(255), s výchozím hodnotou NULL. Pokud je řetězec zdrojů delší než nvarchar(255), hodnota se zkrátí na nvarchar(255).

Aplikace musí zajistit, že název zdroje je jedinečný. Specifikovaný název je interně zahashován do hodnoty, kterou lze uložit do správce zámků SQL Serveru.

@Resource je binárně porovnávána, a tedy je citlivá na velká písmena bez ohledu na nastavení třídění v aktuální databázi.

Poznámka:

Po získání aplikačního zámku lze v prostém textu získat pouze prvních 32 znaků; zbytek bude hashován.

[ @LockMode = ] 'LockMode'

Režim zámku, který je třeba získat pro konkrétní zdroj. @LockMode je varchar(32), bez výchozího nastavení, a je jednou z následujících hodnot:

  • Shared
  • Update
  • IntentShared
  • IntentExclusive
  • Exclusive

Pro více informací viz režimy zámku.

[ @LockOwner = ] 'LockOwner'

Majitel zámku, což je @LockOwner hodnota při žádosti o zámek. @LockOwner je varchar(32), s výchozím hodnotou Transaction. Hodnota může být Sessiontaké . Pokud je hodnota @LockOwner , Transactionvýchozí nebo explicitně stanovená, sp_getapplock musí být vykonána přímo v transakci.

[ @LockTimeout = ] TimeOut

Hodnota vypršení zámku v milisekundách. @LockTimeout je int a výchozí hodnota je stejná jako hodnota vrácená .@@LOCK_TIMEOUT Hodnota ( -1 výchozí) znamená, že neexistuje časový limit (tedy čekání věčně). Pro označení, že požadavek na zámek by měl vrátit zpětný kód místo -1 čekání na zámek, když žádost nemůže být okamžitě schválena, uveďte 0.

[ @DbPrincipal = ] N'DbPrincipal'

Uživatel, role nebo aplikační role, která je oprávněním k objektu v databázi. @DbPrincipal je sysname, s výchozím nastavením public. Volající funkce musí být členem database_principal, DBO nebo db_owner pevné databázové role, aby byla funkce úspěšně volána. Výchozí je veřejná.

Hodnoty návratového kódu

>= 0 (úspěch), nebo < 0 (neúspěch).

Hodnota Result
0 Zámek byl úspěšně udělen synchronně.
1 Zámek byl úspěšně udělen po vyčkání na uvolnění dalších nekompatibilních zámků.
-1 Žádost o zámek vypršela.
-2 Žádost o zámek byla zrušena.
-3 Žádost o zámek byla vybrána jako oběť patové situace.
-999 Označuje validaci parametru nebo jinou chybu volání.

Poznámky

Zámky umístěné na zdroji jsou spojeny buď s aktuální transakcí, nebo s aktuální relací. Zámky spojené s aktuální transakcí se uvolňují, když se transakce potvrdí nebo vrátí zpět. Zámky spojené se relací se uvolňují, když je relace odhlášena. Když se server z jakéhokoliv důvodu vypne, všechny zámky jsou uvolněny.

Zámek vytvořený je sp_getapplock vytvořen v aktuální databázi pro danou relaci. Každý zámekový zdroj je identifikován kombinovanými hodnotami:

  • Databázové ID databáze obsahující zámek.
  • Princip databáze specifikovaný v parametru @DbPrincipal .
  • Název zámku je uveden v parametru @Resource .

Pouze člen principu databáze specifikovaného v parametru @DbPrincipal může získat aplikační zámky, které specifikují tento princip. Členové rolí dbo a db_owner jsou implicitně považováni za členy všech rolí.

Zámky lze explicitně uvolnit pomocí sp_releaseapplock. Když aplikace volá sp_getapplock více pro stejný zdroj zámku, musí být volán stejný početkrát, sp_releaseapplock aby zámek uvolnil. Když je zámek otevřen s vlastníkem Transaction zámku, tento zámek se uvolní při dokončení transakce nebo vrácení zpět.

Pokud sp_getapplock je volán vícekrát pro stejný zámekový zdroj, ale režim zámku specifikovaný v žádném z požadavků není stejný jako existující režim, efekt na zdroj je sjednocením obou režimů zámku. Ve většině případů to znamená, že režim zámku je povýšen na silnější z režimů zámku, stávající režim nebo nově požadovaný režim. Tento silnější režim zámku je držen až do konečného uvolnění zámku, i když volání zámku nastane dříve.

Například v následující sekvenci volání je zdroj držen v Exclusive režimu místo v režimu Shared .

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result AS INT;

EXECUTE
    @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Shared';

EXECUTE
    @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Exclusive';

EXECUTE
    @result = sp_releaseapplock
    @Resource = 'Form1';

COMMIT TRANSACTION;
GO

Patová situace s aplikačním zámkem nevrátí transakci, která požadovala aplikační zámek. Jakýkoli návrat zpět, který by mohl být vyžadován v důsledku vrácené hodnoty, musí být proveden ručně. Proto doporučujeme, aby kontrola chyb byla zahrnuta v kódu, aby pokud jsou vráceny určité hodnoty (například -3), byla zahájena ROLLBACK TRANSACTION nebo alternativní akce.

Tady je příklad:

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result AS INT;

EXECUTE
    @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Exclusive';

IF @result = -3
BEGIN
    ROLLBACK;
END
ELSE
BEGIN
    EXECUTE
        @result = sp_releaseapplock
        @Resource = 'Form1';
    COMMIT TRANSACTION;
END
GO

SQL Server používá aktuální databázové ID k kvalifikaci zdroje. sp_getapplock Pokud je tedy vykonána, i když jsou hodnoty parametrů v různých databázích stejné, výsledkem jsou samostatné zámky na různých zdrojích.

Použijte sys.dm_tran_locks dynamický management view nebo proceduru uloženou sp_lock v systému k prozkoumání informací o zámku, nebo použijte SQL Server Profiler ke sledování zámků.

Povolení

Vyžaduje členství ve veřejné roli .

Examples

Následující příklad umisťuje sdílený zámek, který je spojen s aktuální transakcí, na zdroj Form1 v databázi AdventureWorks2025 .

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result AS INT;

EXECUTE
    @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Shared';

COMMIT TRANSACTION;
GO

Následující příklad specifikuje dbo princip databáze.

BEGIN TRANSACTION;

EXECUTE sp_getapplock
    @DbPrincipal = 'dbo',
    @Resource = 'AdventureWorks2022',
    @LockMode = 'Shared';

COMMIT TRANSACTION;
GO