Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL databáze v Microsoft Fabric
Uzavírá zámek na aplikační zdroj.
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:
SharedUpdateIntentSharedIntentExclusiveExclusive
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