APPLOCK_TEST (Transact-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),沒有預設值。此值可以是下列其中一項:Shared、Update、IntentShared、IntentExclusive、Exclusive。'lock_owner'
這是鎖定的擁有者,也就是要求鎖定時的 lock_owner 值。lock_owner 是 nvarchar(32)。此值可以是 Transaction (預設值) 或 Session。如果明確指定預設值或 Transaction,就必須從交易內執行 APPLOCK_TEST。
傳回類型
smallint
傳回值
當無法將鎖定授與指定的擁有者時,傳回 0;如果可以授與鎖定,便傳回 1。
函數屬性
Nondeterministic
Nonindexable
Nonparallelizable
範例
在下列範例中,具有個別工作階段的兩位使用者 (使用者 A 和使用者 B) 會執行下列 Transact-SQL 陳述式序列。
使用者 A 執行:
USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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