sp_lock (Transact-SQL)
適用対象: SQL サーバー
ロックに関する情報を報告します。
重要
この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 SQL Server データベース エンジンのロックに関する情報を取得するには、sys.dm_tran_locks動的管理ビューを使用します。
構文
sp_lock [ [ @spid1 = ] 'session ID1' ] [ , [@spid2 = ] 'session ID2' ]
[ ; ]
引数
[ @spid1 = ] 'session ID1'
ユーザーがロック情報を必要とするsys.dm_exec_sessionsからのデータベース エンジンセッション ID 番号です。 セッション ID1 は int 既定値は NULL です。 sp_whoを実行して、セッションに関するプロセス情報を取得します。 セッション ID1 が指定されていない場合は、すべてのロックに関する情報が表示されます。
[ @spid2 = ] 'session ID2'
セッション ID1 と同時にロックを持ちユーザーも情報を必要とする、sys.dm_exec_sessionsからの別のデータベース エンジンセッション ID 番号です。 セッション ID 2 は int 既定値は NULL です。
リターン コードの値
成功した場合は 0 を返します。
結果セット
sp_lock結果セットには、@spid1および@spid2パラメーターで指定されたセッションによって保持されるロックごとに 1 行が含まれます。 @spid1も@spid2も指定されていない場合、結果セットは、データベース エンジンのインスタンスで現在アクティブなすべてのセッションのロックを報告します。
列名 | データ型 | 説明 |
---|---|---|
spid | smallint | ロックを要求するプロセスのデータベース エンジンセッション ID 番号。 |
dbid | smallint | ロックが保持されているデータベースの ID 番号です。 DB_NAME() 関数を使用して、データベースを識別できます。 |
ObjId | int | ロックが保持されているオブジェクトの識別番号。 関連するデータベースの OBJECT_NAME() 関数を使用して、オブジェクトを識別できます。 値 99 は、データベース内のページの割り当てを記録するために使用されるシステム ページの 1 つに対するロックを示す特殊なケースです。 |
IndId | smallint | ロックが保持されているインデックスの識別番号。 |
Type | nchar(4) | ロックの種類: RID = 行識別子 (RID) によって識別されるテーブル内の 1 つの行に対するロック。 KEY = シリアル化可能なトランザクションのキーの範囲を保護するインデックス内のロック。 PAG = データまたはインデックス ページのロック。 EXT = エクステントのロック。 TAB = すべてのデータとインデックスを含むテーブル全体のロック。 DB = データベースのロック。 FIL = データベース ファイルのロック。 APP = アプリケーションで指定されたリソースのロック。 MD = メタデータまたはカタログ情報のロック。 HBT = ヒープまたは B ツリー (HoBT) のロック。 この情報は、SQL Server では不完全です。 AU = アロケーション ユニットのロック。 この情報は、SQL Server では不完全です。 |
リソース | nchar(32) | ロックされているリソースを識別する値。 値の形式は、 Type 列で識別されるリソースの種類によって異なります。 Type Value: Resource Value RID: fileid:pagenumber:rid 形式の識別子。fileid はページを含むファイルを識別し、pagenumber は行を含むページを識別し、rid はページ上の特定の行を識別します。 fileid は、sys.database_files カタログ ビューのfile_id列と一致します。 KEY: データベース エンジンによって内部的に使用される 16 進数。 PAG: fileid:pagenumber という形式の数値。fileid はページを含むファイルを識別し、pagenumber はページを識別します。 EXT: エクステント内の最初のページを識別する数値。 この番号は、fileid:pagenumber というフォーマットで指定します。 TAB: テーブルは既に ObjId 列で識別されているため、情報は提供されません。 DB: dbid 列にデータベースが既に識別されているため、情報は提供されません。 FIL: sys.database_files カタログ ビューのfile_id列と一致するファイルの識別子。 APP: ロックされているアプリケーション リソースに固有の識別子。 DbPrincipalId:<リソース文字列の 2 ~ 16 文字の形式で><hashed 値>。 MD: リソースの種類によって異なります。 詳細については、sys.dm_tran_locks (Transact-SQL)のresource_description列の説明を参照してください。 HBT : 情報は提供されません。 代わりに、 sys.dm_tran_locks 動的管理ビューを使用してください。 AU: 情報は提供されていません。 代わりに、 sys.dm_tran_locks 動的管理ビューを使用してください。 |
Mode | nvarchar(8) | 要求されたロック モードです。 次の値をとります。 NULL = リソースへのアクセスは許可されていません。 プレースホルダーとして機能します。 Sch-S = スキーマ安定度。 任意のセッションがスキーマ要素のスキーマ安定性ロックを保持している間、テーブルやインデックスなどのスキーマ要素が削除されないようにします。 Sch-M = スキーマ修正。 指定したリソースのスキーマを変更するセッションで保持する必要があります。 指定されたオブジェクトを他のセッションが参照しないようにします。 S = 共有。 保持しているセッションに、リソースへの共有アクセスが許可されます。 U = 更新。 リソース上で取得された更新ロックが、最終的に更新されることが許可されます。 これは、複数のセッションが後で潜在的な更新のためにリソースをロックするときに発生する一般的な形式のデッドロックを防ぐために使用されます。 X = 排他。 保持しているセッションで、リソースへの排他アクセスが許可されます。 IS = 意図共有。 ロック階層の下位のリソースに X ロックを設定するよう指定します。 IU = インテント更新。 ロック階層の下位のリソースに U ロックを設定するよう指定します。 IX = インテント排他。 ロック階層の下位のリソースに X ロックを設定するよう指定します。 SIU = 共有インテントの更新。 ロック階層の下位のリソースに更新ロックを設定する目的で、リソースへの共有アクセスを指定します。 SIX = 共有インテント排他。 ロック階層の下位のリソースに更新ロックを設定する目的で、リソースへの共有アクセスを指定します。 UIX = 意図排他の更新。 ロック階層の下位のリソースに排他ロックを設定する目的で、リソースに保持する更新ロックを指定します。 BU = 一括更新。 一括操作で使用されます。 RangeS_S = 共有キー範囲と共有リソースのロック。 シリアル化可能な範囲スキャンを示します。 RangeS_U = 共有キー範囲および更新リソース ロック。 シリアル化可能な更新プログラムのスキャンを示します。 RangeI_N = 挿入キー範囲と NULL リソース ロック。 インデックスに新しいキーを挿入する前に範囲をテストするために使用されます。 RangeI_S = キー範囲変換ロック。 RangeI_Nロックと S ロックの重なりによって作成されます。 RangeI_U = RangeI_Nロックと U ロックの重複によって作成されるキー範囲変換ロック。 RangeI_X = RangeI_Nロックと X ロックの重なりによって作成されるキー範囲変換ロック。 RangeX_S = RangeI_NとRangeS_Sの重複によって作成されるキー範囲変換ロック。 ロック。 RangeX_U = 範囲 I_N と範囲 S_U ロックの重複によって作成されるキー範囲変換ロックです。 RangeX_X = 排他キー範囲と排他リソース ロック。 範囲内のキーを更新する場合に使用する変換ロックです。 |
Status | nvarchar(5) | ロック要求の状態: CNVRT: ロックは別のモードから変換されていますが、競合モードのロックを保持している別のプロセスによって変換がブロックされます。 GRANT : ロックが取得されたことを示します。 WAIT : 競合するモードでロックを保持している別のプロセスによってロックがブロックされていることを示します。 |
解説
ユーザーは、次の方法で読み取り操作のロックを制御できます。
SET TRANSACTION ISOLATION LEVEL を使用してセッションのロック レベルを指定します。 構文と制限については、「 SET TRANSACTION ISOLATION LEVEL (Transact-SQL)を参照してください。
ロック テーブル ヒントを使用して、FROM 句での個々のテーブル参照のロック レベルを指定します。 構文と制限については、「テーブル ヒント (Transact-SQL)」をご覧ください。
セッションに関連付けられていないすべての分散トランザクションは、孤立しているトランザクションです。 データベース エンジンは、孤立したすべての分散トランザクションに SPID 値 -2 を割り当てます。これにより、ユーザーはブロックされている分散トランザクションを簡単に識別できます。 詳細については、「マークされたトランザクションを使用して関連するデータベースを一貫した状態に復旧する方法 (完全復旧モデル)」を参照してください。
アクセス許可
VIEW SERVER STATE アクセス許可が必要です。
例
A. すべてのロックの一覧表示
次の例では、データベース エンジンのインスタンスに現在保持されているすべてのロックに関する情報を表示します。
USE master;
GO
EXEC sp_lock;
GO
B. 1 つのサーバー プロセスからロックを表示する
次の例では、プロセス ID 53
に関する情報を表示します。ロックなどの情報も含まれます。
USE master;
GO
EXEC sp_lock 53;
GO
参照
sys.dm_tran_locks (Transact-SQL)
DB_NAME (Transact-SQL)
KILL (Transact-SQL)
OBJECT_NAME (Transact-SQL)
sp_who (Transact-SQL)
sys.database_files (Transact-SQL)
sys.dm_os_tasks (Transact-SQL)
sys.dm_os_threads (Transact-SQL)
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示