APPLOCK_TEST (Transact-SQL)

ロックを取得せずに指定されたロック所有者の特定のアプリケーション リソースのロックを許可できるかどうかについての情報を返します。 APPLOCK_TEST はアプリケーション ロック関数であり、現在のデータベース上で動作します。 アプリケーション ロックのスコープはデータベースです。

トピック リンク アイコン Transact-SQL 構文表記規則

構文

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) で、既定値はありません。 SharedUpdateIntentSharedIntentExclusiveExclusive のいずれかの値をとります。

  • ' lock_owner '
    ロックの所有者を指定します。これはロックが要求されたときの lock_owner の値です。 lock_owner のデータ型は nvarchar(32) です。 この値は Transaction (既定値) または Session のいずれかです。 既定値または Transaction を明示的に指定した場合、APPLOCK_TEST はトランザクション内から実行する必要があります。

戻り値の型

smallint

戻り値

指定された所有者にロックを許可できない場合は 0 を、ロックを許可できる場合は 1 を返します。

関数のプロパティ

非決定的

インデックス不可

並列不可

使用例

次の例では、個別にセッションを開いている 2 人のユーザー (ユーザー Aユーザー B) が、一連の Transact-SQL ステートメントを実行します。

ユーザー A が次のステートメントを実行します。

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

次に、ユーザー B が次のステートメントを実行します。

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

次に、ユーザー 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)