行ロックの動作についてお試ししてみる
行単位にロックを獲得するため、下記のようなクエリを発行することがあるかと思います。
SELECT * FROM WideWorldImporters.Sales.OrderLines WITH(XLOCK,ROWLOCK) WHERE OrderID = 10
それでは下記のクエリをSQL Server Management Studio で実行してみましょう。
BEGIN TRAN SELECT * FROM WideWorldImporters.Sales.OrderLines WITH(XLOCK,ROWLOCK) WHERE OrderID = 10 COMMIT TRAN
実際にどのようなロックがかかっているかチェックしてみましょう。下記のクエリを SQL Server Management Studio で実行してみましょう。
SELECT * FROM sys.dm_tran_locks WHERE request_session_id = 55
行ロックがかかっているのが判断できます。
新しいクエリペインを開いて、下記のクエリを SQL Server Management Studio で実行します。またされてしまいますね。
SELECT * FROM WideWorldImporters.Sales.OrderLines WITH(XLOCK,ROWLOCK) WHERE OrderID = 10
新しいクエリペインを開いて、下記のクエリを SQL Server Management Studio で実行します。ロック要求がタイムアウトします。
SELECT * FROM WideWorldImporters.Sales.OrderLines WITH(XLOCK,ROWLOCK,NOWAIT) WHERE OrderID = 10
NOWAIT オプションによって、ロック要求が即座にタイムアウトします。同じような動作は下記のクエリでも実現できます。
SET LOCK_TIMEOUT 0 SELECT * FROM WideWorldImporters.Sales.OrderLines WITH(XLOCK,ROWLOCK) WHERE OrderID = 10
業務仕様上許されるのであれば、NOWAIT の対応ができますね。無駄な待ちを発生させず、アプリケーションのパフォーマンスも向上するかと思います。
プロとなるには、まだまだほど遠い....
- 作者: 福田武志
- 出版社/メーカー: ソフトバンク クリエイティブ
- 発売日: 2007/03/28
- メディア: 単行本
- 購入: 4人 クリック: 108回
- この商品を含むブログ (18件) を見る