Compartilhar via


APPLOCK_TEST (Transact-SQL)

Retorna informações sobre o fato de ser possível ou não conceder um bloqueio em um recurso de aplicativo específico para um proprietário de bloqueio especificado, sem adquirir o bloqueio. APPLOCK_TEST é uma função de bloqueio de aplicativo e opera no banco de dados atual. O escopo de bloqueios de aplicativo é o banco de dados.

Ícone de vínculo de tópico Convenções da sintaxe 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. O chamador da função deve ser um membro de database_principal, dbo ou a função de banco de dados fixa db_owner para chamar a função com êxito.

  • ' resource_name '
    É um nome de recurso de bloqueio especificado pelo aplicativo cliente. O aplicativo deve garantir que o recurso seja exclusivo. O nome especificado recebe um hash internamente e, consequentemente, é transformado em um valor que pode ser armazenado no gerenciador de bloqueio do SQL Server. resource_name* *é nvarchar(255) sem valor padrão. resource_name é binário comparado e diferencia maiúsculas e minúsculas, independentemente das configurações de agrupamento do banco de dados atual.

  • ' lock_mode '
    É o modo de bloqueio a ser obtido para um recurso específico. lock_mode é nvarchar(32) e não tem nenhum valor padrão. O valor pode ser qualquer um dos seguintes: 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). O valor pode ser Transação (o padrão) ou Sessão. Se o padrão ou Transaction for especificado explicitamente, APPLOCK_TEST deverá ser executado a partir de uma transação.

Tipos de retorno

smallint

Valor de retorno

Retorna 0 quando o bloqueio não puder ser concedido ao proprietário especificado e retorna 1 se o bloqueio puder ser concedido.

Propriedades da função

Não determinístico

Não indexável

Não paralelizável

Exemplos

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

O Usuário A executa:

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

Então, o Usuário B executa:

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

Então, o Usuário A executa:

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

Então, o Usuário B executa:

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

Então, o Usuário A e o Usuário B ambos executam:

COMMIT TRAN;
GO

Consulte também

Referência

APPLOCK_MODE (Transact-SQL)

sp_getapplock (Transact-SQL)

sp_releaseapplock (Transact-SQL)