readcommited 分離レベルを使用して、1 つのトランザクションで行を更新しています。他のトランザクションから、行を更新しようとせずに、同じ行に配置されたロックがあることを確認するにはどうすればよいですか。何か案が?
3 に答える
ロックを確認する唯一の方法は、自分でロックを取得することです。これはデータベースに固有のものではなく、並行性に関する一般的な問題です。ロックが保持されているかどうかを「チェック」する API の形式は根本的に壊れています。定義により、この API チェックの結果に基づいて実行されるアクションは間違っているためです。API がロックをチェックしたときにロックが保持されていなかったことがわかっていても、API が返されるまでにロックが保持されていないことを意味するわけではありません。
ロックについて問い合わせると、正しいプログラムを作成できない可能性があります。正しいプログラムを作成する唯一の方法は、ロックを取得することです。SQL では、他のプログラミング言語と同様に真です。
SET LOCK_TIMEOUT 0
インスタント タイムアウト ( ) を使用してロックを取得し、競合時に発生するロック タイムアウト エラーを処理する試みを止めるものは何もありません。
sp_lock
ロックに関する情報を取得するには、プロシージャを実行でき ます。
注: VIEW SERVER STATE
許可が必要です。
SQL Server 2008 では、sys.dm_tran_locks動的管理ビューを使用できます。
行レベルではなくテーブルレベルでロックを見つけることができると思います
以下のコードを試してみると、現在ロックされているテーブルが表示されます。
SELECT t.name as [Table Name]
FROM sys.dm_tran_locks as t1
Join sys.objects o1 on o1.object_id = t1.resource_associated_entity_id
Join sys.tables t on o1.object_id = t.object_id