APPLOCK_TEST (Transact-SQL)

Restituisce le informazioni relative alla possibilità o meno di concedere un blocco per una risorsa dell'applicazione specifica a un proprietario di blocchi specifico senza acquisire il blocco stesso. APPLOCK_TEST è una funzione di blocco a livello di applicazione e viene eseguita nel database corrente. L'ambito dei blocchi a livello di applicazione è il database.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • 'database_principal'
    Utente, ruolo o ruolo applicazione a cui è possibile concedere le autorizzazioni per gli oggetti nel database. Affinché la chiamata della funzione abbia esito positivo, è necessario che il chiamante sia un membro del ruolo predefinito del database database_principal, dbo o db_owner.

  • 'resource_name'
    Nome della risorsa di blocco specificato nell'applicazione client. L'applicazione deve garantire che la risorsa sia univoca. Per il nome specificato viene eseguito internamente l'hashing in un valore che è possibile archiviare in Gestione blocchi di SQL Server. resource_nameè di tipo nvarchar(255) e non prevede alcun valore predefinito. resource_name viene confrontato a livello binario e fa distinzione tra maiuscole e minuscole, indipendentemente dalle impostazioni delle regole di confronto definite nel database corrente.

  • 'lock_mode'
    Modalità di blocco da acquisire per una particolare risorsa. lock_mode è di tipo nvarchar(32) e non prevede alcun valore predefinito. I possibili valori sono i seguenti: Shared, Update, IntentShared, IntentExclusive, Exclusive.

  • 'lock_owner'
    Proprietario del blocco, ovvero il valore di lock_owner quando il blocco è stato richiesto. lock_owner è di tipo nvarchar(32). Il valore può essere Transaction (impostazione predefinita) oppure Session. Se si specifica in modo esplicito il valore predefinito o Transaction, è necessario eseguire APPLOCK_TEST dall'interno di una transazione.

Tipi restituiti

smallint

Valore restituito

Restituisce 0 se il blocco non può essere concesso al proprietario specificato. In caso contrario restituisce 1.

Funzione Properties

Non deterministica

Nonindexable

Nonparallelizable

Esempi

Nell'esempio seguente due utenti (User A e User B) con sessioni separate eseguono la sequenza di istruzioni Transact-SQL riportata di seguito.

User A esegue:

USE AdventureWorks;
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

User B quindi esegue:

Use AdventureWorks;
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

User A quindi esegue:

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

User B quindi esegue:

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

User A e User B quindi eseguono entrambi:

COMMIT TRAN;
GO