Compartilhar via


APPLOCK_MODE (Transact-SQL)

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

Essa função retorna o modo de bloqueio mantido pelo proprietário de bloqueio em um determinado recurso de aplicativo. Como uma função de bloqueio de aplicativo, a APPLOCK_MODE 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_MODE( 'database_principal' , 'resource_name' , '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_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.

Tipos de retorno

nvarchar(32)

Valor retornado

Retorna o modo de bloqueio mantido pelo proprietário de bloqueio em um determinado recurso de aplicativo. O modo de bloqueio pode ter qualquer um destes valores:

NoLock
Atualização
*SharedIntentExclusive

IntentShared
IntentExclusive
*UpdateIntentExclusive

Compartilhado
Exclusive

*Este modo de bloqueio é uma combinação de outros modos de bloqueio e o sp_getapplock não pode adquiri-lo explicitamente.

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  

Usuário B executa:

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

O Usuário A e o Usuário B executam:

COMMIT TRAN;  
GO  

Confira também

APPLOCK_TEST (Transact-SQL)
sp_getapplock (Transact-SQL)
sp_releaseapplock (Transact-SQL)