APPLOCK_MODE (Transact-SQL)
Restituisce la modalità di blocco acquisita dal proprietario del blocco per una particolare risorsa di applicazione. APPLOCK_MODE è una funzione di blocco a livello di applicazione e viene eseguita sul database corrente. L'ambito dei blocchi a livello di applicazione è il database.
Convenzioni della sintassi Transact-SQL
Sintassi
APPLOCK_MODE( 'database_principal' , 'resource_name' , 'lock_owner' )
Argomenti
'database_principal'
Utente, ruolo o ruolo applicazione a cui è possibile concedere 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 di una risorsa di blocco specificato nell'applicazione client. L'applicazione deve garantire che il nome della risorsa sia univoco. Il nome specificato viene sottoposto internamente ad hashing per creare un valore che è possibile archiviare in Gestione blocchi di SQL Server. resource_name* *è di tipo nvarchar(255) e non prevede alcun valore predefinito. Per resource_name viene eseguito un confronto binario ed è supportata la distinzione tra maiuscole e minuscole, indipendentemente dalle impostazioni delle regole di confronto del database corrente.'lock_owner'
Proprietario del blocco, ovvero il valore di lock_owner quando è stato richiesto il blocco. lock_owner è di tipo nvarchar(32) e il valore può essere Transaction (valore predefinito) o Session.
Tipi restituiti
nvarchar(32)
Valore restituito
Restituisce la modalità di blocco acquisita dal proprietario del blocco per una particolare risorsa di applicazione. I possibili valori della modalità di blocco sono i seguenti:
NoLock |
Update |
*SharedIntentExclusive |
IntentShared |
IntentExclusive |
*UpdateIntentExclusive |
Shared |
Exclusive |
|
*Questa modalità di blocco risulta dalla combinazione di altre modalità di blocco e non può essere acquisita in modo esplicito tramite sp_getapplock.
Proprietà delle funzioni
Nondeterministic
Nonindexable
Nonparallelizable
Esempi
Si supponga che due utenti, l'utente User A e l'utente User B eseguano la sequenza di istruzioni Transact-SQL riportata di seguito in sessioni separate.
User A esegue:
USE AdventureWorks2012;
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
Quindi User B esegue:
Use AdventureWorks2012;
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
Quindi User A esegue:
EXEC sp_releaseapplock @Resource='Form1', @DbPrincipal='public';
GO
Quindi User B esegue:
SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');
--Result set: '1' (The lock is grantable.)
GO
User A e User B quindi eseguono:
COMMIT TRAN;
GO