Partilhar via


APPLOCK_TEST (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Essa função retorna informações sobre ser possível ou não conceder um bloqueio em um recurso de aplicativo específico para um proprietário de bloqueio especificado, sem aquisição do bloqueio. Como uma função de bloqueio de aplicativo, a APPLOCK_TEST opera no banco de dados atual. O banco de dados é o escopo dos bloqueios de aplicativo.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

' database_principal '
O usuário, a função ou a função de aplicativo que pode receber permissões para objetos no banco de dados. Para chamar a função com êxito, o chamador da função deve ser membro de database_principal, dbo, ou a função de banco de dados fixa db_owner.

' resource_name '
Um nome de recurso de bloqueio especificado pelo aplicativo cliente. O aplicativo deve garantir um nome do recurso exclusivo. O nome especificado passa internamente por hash, tornando-se um valor que o gerenciador de bloqueio do SQL Server pode armazenar internamente. resource_name é nvarchar(255) , sem nenhum padrão. resource_name é comparado com binário comparado e diferencia maiúsculas de minúsculas, independentemente das configurações de ordenação do banco de dados atual.

' lock_mode '
O modo de bloqueio a ser obtido para um recurso específico. lock_mode é nvarchar(32), sem nenhum valor padrão. lock_mode pode ter qualquer um destes valores: Shared, Update, IntentShared, IntentExclusive, Exclusive.

' lock_owner '
O proprietário do bloqueio, que é o valor de lock_owner quando o bloqueio foi solicitado. lock_owner é nvarchar(32) e o valor pode ser Transaction (o padrão) ou Session. Se o padrão ou Transaction for especificado explicitamente, APPLOCK_TEST deverá ser executado de uma transação.

Tipos de retorno

smallint

Valor retornado

0 se o bloqueio não puder ser concedido ao proprietário especificado, ou 1 se o bloqueio puder ser concedido.

Propriedades da função

Não determinístico

Não indexável

Não paralelizável

Exemplos

Dois usuários (Usuário A e Usuário B), com sessões separadas, executam a seguinte sequência de instruções Transact-SQL.

Usuário A executa:

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  

O Usuário B então executa:

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  

Então, o Usuário A executa:

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

O Usuário B então executa:

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

Usuário A e Usuário B executam:

COMMIT TRAN;  
GO  

Confira também

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