APPLOCK_TEST (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體
此函數所傳回的資訊,乃是關於在未取得鎖定的情況下,針對指定的鎖定擁有者,是否可以將鎖定授與特定應用程式資源。 APPLOCK_TEST 是應用程式鎖定函數,會在目前的資料庫上運作。 資料庫是應用程式鎖定的範圍。
語法
APPLOCK_TEST ( 'database_principal' , 'resource_name' , 'lock_mode' , 'lock_owner' )
引數
' database_principal '
可被授與資料庫中物件權限的使用者、角色或應用程式角色。 函數的呼叫者必須是 database_principal、dbo 或 db_owner 固定資料庫角色的成員,才能成功呼叫函數。
' resource_name '
用戶端應用程式指定的鎖定資源名稱。 應用程式必須確定資源名稱是唯一的。 指定的名稱會在內部雜湊成值,而 SQL Server 鎖定管理員可將其儲存在內部。 resource_name 是沒有預設值的 nvarchar(255) 。 resource_name 是以二進位來比較,不論目前資料庫的定序設定為何,都會區分大小寫。
' lock_mode '
針對特定資源要取得的鎖定模式。 lock_mode 是沒有預設值的 nvarchar(32)。 lock_mode 可具有下列任何一個值:Shared、Update、IntentShared、IntentExclusive、Exclusive。
' lock_owner '
為鎖定的擁有者,也就是要求鎖定時的 lock_owner 值。 lock_owner 是 nvarchar(32),而且此值可以是交易 (預設值) 或工作階段。 如果明確指定預設值或 Transaction,就必須從交易內執行 APPLOCK_TEST。
傳回類型
smallint
傳回值
如果無法將鎖定授與指定的擁有者則為 0,如果可以授與鎖定則為 1。
函式屬性
不具決定性
Nonindexable
Nonparallelizable
範例
具有個別工作階段的兩位使用者 (使用者 A 和 使用者 B),會依下列順序執行 Transact-SQL 陳述式。
使用者 A 執行:
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
使用者 B 接著執行:
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
使用者 A 接著執行:
EXEC sp_releaseapplock @Resource='Form1', @DbPrincipal='public';
GO
使用者 B 接著執行:
SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');
--Result set: '1' (The lock is grantable.)
GO
使用者 A 和使用者 B 接著同時執行:
COMMIT TRAN;
GO
請參閱
APPLOCK_MODE (Transact-SQL)
sp_getapplock (Transact-SQL)
sp_releaseapplock (Transact-SQL)