APPLOCK_TEST (Transact-SQL)
Devuelve información acerca de si se puede conceder o no un bloqueo en un recurso de aplicación determinado para el propietario de un bloqueo específico, sin adquirir el bloqueo. APPLOCK_TEST es una función de bloqueo de aplicación que opera en la base de datos actual. El ámbito de los bloqueos de aplicación es la base de datos.
Convenciones de sintaxis de Transact-SQL
Sintaxis
APPLOCK_TEST ( 'database_principal' , 'resource_name' , 'lock_mode' , 'lock_owner' )
Argumentos
- 'database_principal'
Es el usuario, la función o la función de aplicación a la que se pueden conceder permisos para los objetos de la base de datos. El autor de la llamada de la función debe ser miembro de database_principal, dbo o la función fija de base de datos db_owner para poder llamar a la función correctamente.
- 'resource_name'
Se trata de un nombre de recurso de bloqueo especificado por la aplicación cliente. La aplicación debe garantizar que el recurso es único. Al nombre especificado se le aplica internamente un algoritmo hash para obtener un valor que se pueda almacenar en el administrador de bloqueos de SQL Server. resource_namees de tipo nvarchar(255) y no tiene ningún valor predeterminado. resource_name se compara con un binario y distingue entre mayúsculas y minúsculas, independientemente de la configuración de intercalación de la base de datos actual.
- 'lock_mode'
Es el modo de bloqueo que se va a obtener para un determinado recurso. lock_mode es de tipo nvarchar(32) y no tiene ningún valor predeterminado. El valor puede ser: Shared, Update, IntentShared, IntentExclusive, Exclusive.
- 'lock_owner'
Es el propietario del bloqueo, que es el valor de lock_owner cuando se solicitó el bloqueo. lock_owner es de tipo nvarchar(32). El valor puede ser Transaction (predeterminado) o Session. Si se especifica el valor predeterminado o Transaction explícitamente, debe ejecutarse APPLOCK_TEST desde una transacción.
Tipos de valor devueltos
smallint
Valor devuelto
Devuelve 0 cuando no se puede conceder el bloqueo al propietario especificado y devuelve 1 si se puede conceder el bloqueo.
Propiedades de la función
No determinista
No indizable
No paralelizable
Ejemplos
En el ejemplo siguiente, dos usuarios (Usuario A y Usuario B) con sesiones independientes ejecutan la siguiente secuencia de instrucciones Transact-SQL.
El Usuario A ejecuta:
USE AdventureWorks;
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
Después, el Usuario B ejecuta:
Use AdventureWorks;
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
Después, el Usuario A ejecuta:
EXEC sp_releaseapplock @Resource='Form1', @DbPrincipal='public';
GO
Después, el Usuario B ejecuta:
SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');
--Result set: '1' (The lock is grantable.)
GO
Después, el Usuario A y el Usuario B ejecutan:
COMMIT TRAN;
GO
Vea también
Referencia
APPLOCK_MODE (Transact-SQL)
sp_getapplock (Transact-SQL)
sp_releaseapplock (Transact-SQL)