Condividi tramite


APPLOCK_TEST (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

Questa funzione 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 che viene eseguita nel database corrente. L'ambito dei blocchi a livello di applicazione è il database.

Convenzioni relative alla 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 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 internamente 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_mode '
Modalità di blocco da ottenere per una risorsa specifica. lock_mode è di tipo nvarchar(32) e non dispone di valore predefinito. lock_mode può avere uno dei valori seguenti: Shared, Update, IntentShared, IntentExclusive, Exclusive.

' lock_owner '
Proprietario del blocco, ovvero il valore di lock_owner al momento della richiesta del blocco. lock_owner è di tipo nvarchar(32) e il valore può essere Transaction (impostazione predefinita) o 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

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

Proprietà delle funzioni

Nondeterministic

Nonindexable

Nonparallelizable

Esempi

Si supponga che due utenti, l'utente A e l'utente B, eseguano la sequenza di istruzioni di Transact-SQL riportata di seguito in sessioni separate.

User A esegue:

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  

Quindi User B esegue:

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  

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  

Quindi sia User A che User B eseguono:

COMMIT TRAN;  
GO  

Vedi anche

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