APPLOCK_TEST (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Denna funktion returnerar information om huruvida ett lås kan beviljas på en viss applikationsresurs, för en specificerad låsägare, utan att låset förvärvas. Som en applikationslåsfunktion fungerar APPLOCK_TEST på den aktuella databasen. Databasen är omfattningen av applikationslåsen.

Transact-SQL syntaxkonventioner

Syntax

APPLOCK_TEST ( 'database_principal' , 'resource_name' , 'lock_mode' , 'lock_owner' )  

Arguments

'database_principal'
Användaren, rollen eller applikationsrollen som kan ges behörigheter till objekt i databasen. För att framgångsrikt anropa funktionen måste funktionsanroparen vara medlem i database_principal, dbo eller den db_owner fasta databasrollen.

'resource_name'
Ett låsresursnamn som specificeras av klientapplikationen. Applikationen måste säkerställa ett unikt resursnamn. Det angivna namnet hashas internt till ett värde som SQL Server-låshanteraren kan lagra internt. resource_nameär nvarchar(255), utan standard. resource_name är binärjämförd och är kasuskänslig oavsett sorteringsinställningarna i den aktuella databasen.

'lock_mode'
Låsläget för att få tag på en specifik resurs. lock_mode är nvarchar(32), utan standardvärde. lock_mode kan ha någon av dessa värden: Delat, Uppdaterat, AvsiktDelat,AvsiktExklusivt, Exklusivt.

'lock_owner'
Ägaren till låset, vilket är det lock_owner värdet när låset begärdes. lock_owner är nvarchar(32), och värdet kan vara antingen Transaktion (standard) eller Session. Om default eller Transaction är uttryckligen specificerad måste APPLOCK_TEST utföras inifrån en transaktion.

Returtyper

smallint

Returvärde

0 om låset inte kan ges till den angivna ägaren, eller 1 om låset kan beviljas.

Funktionsegenskaper

Icke-deterministisk

Icke-indexerbar

Icke-parallelliserbar

Examples

Två användare (Användare A och Användare B), med separata sessioner, kör följande sekvens av Transact-SQL satser.

Användare A kör:

USE AdventureWorks2022;  
GO  
BEGIN TRAN;  
DECLARE @result INT;  
EXEC @result=sp_getapplock  
    @DbPrincipal='public',  
    @Resource='Form1',  
    @LockMode='Shared',  
    @LockOwner='Transaction';  
SELECT APPLOCK_MODE('public', 'Form1', 'Transaction');  
GO  

Användare B kör sedan:

Use AdventureWorks2022;  
GO  
BEGIN TRAN;  
SELECT APPLOCK_MODE('public', 'Form1', 'Transaction');  
--Result set: NoLock  
  
SELECT APPLOCK_TEST('public', 'Form1', 'Shared', 'Transaction');  
--Result set: 1 (Lock is grantable.)  
  
SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');  
--Result set: 0 (Lock is not grantable.)  
GO  

Användare A kör sedan:

EXEC sp_releaseapplock @Resource='Form1', @DbPrincipal='public';  
GO  

Användare B kör sedan:

SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');  
--Result set: '1' (The lock is grantable.)  
GO  

Användare A och Användare B kör då båda:

COMMIT TRAN;  
GO  

Se även

APPLOCK_MODE (Transact-SQL)
sp_getapplock (Transact-SQL)
sp_releaseapplock (Transact-SQL)