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.
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
Vedere anche