APPLOCK_MODE (Transact-SQL)
特定のアプリケーション リソースで、ロック所有者によって保持されているロック モードを返します。APPLOCK_MODE はアプリケーション ロック関数であり、現在のデータベースで動作します。アプリケーション ロックのスコープはそのデータベースです。
構文
APPLOCK_MODE( 'database_principal' , 'resource_name' , 'lock_owner' )
引数
'database_principal'
データベース内のオブジェクトに対する権限を許可されるユーザー、ロール、またはアプリケーション ロールです。この関数を呼び出すには、database_principal、dbo、または固定データベース ロール db_owner のメンバーである必要があります。'resource_name'
クライアント アプリケーションによって指定されたロック リソース名を指定します。アプリケーション側では、リソース名が一意になるよう管理されている必要があります。指定した名前は内部的にハッシュされ、SQL Server ロック マネージャーに格納できる値に変換されます。resource_name のデータ型は nvarchar(255) で、既定値はありません。resource_name はバイナリで比較されるため、現在のデータベースの照合順序の設定に関係なく、大文字と小文字が区別されます。'lock_owner'
ロックの所有者を指定します。これはロックが要求されたときの lock_owner の値です。lock_owner のデータ型は nvarchar(32) で、値には Transaction (既定値) または Session のいずれかを指定できます。
戻り値の型
nvarchar(32)
戻り値
特定のアプリケーション リソースで、ロック所有者によって保持されているロック モードを返します。ロック モードは次のいずれかの値になります。
NoLock |
Update |
*SharedIntentExclusive |
IntentShared |
IntentExclusive |
*UpdateIntentExclusive |
Shared |
Exclusive |
|
* このロック モードは他のロック モードの組み合わせであり、sp_getapplock を使用して明示的に取得することはできません。
関数のプロパティ
Nondeterministic
Nonindexable
Nonparallelizable
例
次の例では、個別にセッションを開いている 2 人のユーザー (ユーザー 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