APPLOCK_TEST (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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

Transact-SQL 構文表記規則

構文

APPLOCK_TEST ( 'database_principal' , 'resource_name' , 'lock_mode' , 'lock_owner' )  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

'database_principal'
データベース内のオブジェクトに対するアクセス許可を許可されるユーザー、ロール、またはアプリケーション ロールです。 関数を正常に呼び出すには、関数の呼び出し元が database_principal、dbo、または、db_owner 固定データベース ロールのメンバーである必要があります。

'resource_name'
クライアント アプリケーションによって指定されたロック リソース名を指定します。 アプリケーション側では、リソース名が一意になるよう管理されている必要があります。 指定した名前は、SQL Server ロック マネージャーが内部的に保存できる値に内部的にハッシュされます。 resource_namenvarchar (255) であり、既定値はありません。 resource_name はバイナリ比較し、現在のデータベースの照合順序の設定に関係なく大文字小文字を区別します。

'lock_mode'
特定のリソースに対して取得するロック モード。 lock_modenvarchar (32) であり、既定値はありません。 lock_mode は、SharedUpdateIntentSharedIntentExclusiveExclusive のいずれかの値をとります。

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

戻り値の型

smallint

戻り値

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

関数のプロパティ

非決定的

インデックス不可

並列不可

セッションが異なる 2 人のユーザー (ユーザー 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)