デッドロックについて説明してみる - その 1 ( 一回で終わるかもしれないけど、その 1 にしてみた ) -
近所の近くで少し早起きして、記事書きます。いつもより早起きするのもいいですね(^^♪
最近、デッドロックしている人 ( 作業に行き詰まるわけではなく、SQL Server のほうですw ) が多いので、デッドロックのおさらいしてみましょう。デッドロックとは、
デッドロック (英: deadlock) とは、特に計算機科学において、2つ以上のスレッドあるいはプロセスなどの処理単位が互いの処理終了を待ち、結果としてどの処理も先に進めなくなってしまうことを言う。
早速、SQL Server Management Studio でデッドロックの実験をしてみましょう。データベースは AdventureWorks で、テーブルは Production.Product を使用します。下記の二つのクエリを SQL Server Management Studio で実行させてみましょう。
- クエリ 1
DECLARE @Error_Message NVARCHAR(MAX); DECLARE @Error_Severity INT; DECLARE @Error_State INT; WHILE 0 = 0 BEGIN BEGIN TRY BEGIN TRAN -- ProductID = 2 のデータを更新する。 UPDATE Production.Product SET Name = N'Bearing Ball' WHERE ProductID = 2 -- ProductID = 1 のデータを更新する。 UPDATE Production.Product SET Name = N'Adjustable Race' WHERE ProductID = 1 COMMIT TRAN END TRY -- 例外をキャッチしたら、メッセージを出力して処理を終了する。 BEGIN CATCH SET @Error_Message = ERROR_MESSAGE(); SET @Error_Severity = ERROR_SEVERITY(); SET @Error_State = ERROR_STATE(); RAISERROR(@Error_Message, @Error_Severity, @Error_State); BREAK; END CATCH END
- クエリ 2
DECLARE @Error_Message NVARCHAR(MAX); DECLARE @Error_Severity INT; DECLARE @Error_State INT; WHILE 0 = 0 BEGIN BEGIN TRY BEGIN TRAN -- ProductID = 1 のデータを更新する。 UPDATE Production.Product SET Name = N'Adjustable Race' WHERE ProductID = 1 -- ProductID = 2 のデータを更新する。 UPDATE Production.Product SET Name = N'Bearing Ball' WHERE ProductID = 2 COMMIT TRAN END TRY -- 例外をキャッチしたら、メッセージを出力して処理を終了する。 BEGIN CATCH SET @Error_Message = ERROR_MESSAGE(); SET @Error_Severity = ERROR_SEVERITY(); SET @Error_State = ERROR_STATE(); RAISERROR(@Error_Message, @Error_Severity, @Error_State); BREAK; END CATCH END
クエリ 1 がデッドロックにより処理が終了しました。
-
デッドロックが発生するまでのフローは下記の通りです。
- トランザクション 2 から Product = 1 のデータを更新する。
- トランザクション 1 から Product = 2 のデータを更新する。
- トランザクション 2 から Product = 2 のデータを更新する。ここでロック待ちになる。
- トランザクション 1 から Product = 1 のデータを更新する。ここで入れ子に待ちになり、デッドロックが発生する。その結果、トランザクション 1 がキャンセルされ、データがロールバックされる。
このようなケースでは対処方法は非常に簡単で、クエリ 1 および クエリ 2 のレコードの更新順番 ( 例:ProcuctID = 1 を更新してから、ProcuctID = 2 を更新する。 ) を下図のように同一にします。( ブロッキングは発生します。 )
その 1 だけでは終わらなそうです。その 2 からは身の回りで発生したデッドロックの事例とその説明をしたいと思います。
Lenovo YOGA BOOK 用のケースがちらほら。
【TopAce】Lenovo yoga book 10.1用レザーバッグ タブレット ケース カバー スリーブ (ブラウン)
- 出版社/メーカー: TopAce.JP
- メディア: エレクトロニクス
- この商品を含むブログを見る
Infiland Yoga Book ケース Lenovo 2in1 タブレット YOGA BOOK 10.1インチ 専用保護ケース 超薄型 最軽量 実用型 内包型 PUレザーカバー
- 出版社/メーカー: Infiland
- メディア: エレクトロニクス
- この商品を含むブログを見る
明らかに対応していなさそうなものもあったりする。
【ShineZone】Lenovo Yoga Book 10.1 専用保護ケース 超薄型 高級PUレザー・スタンド機能付き (ブルー)
- 出版社/メーカー: ShineZone.JP
- メディア: エレクトロニクス
- この商品を含むブログを見る
Lenovo YOGA BOOK はよ。
こんな使い方もあるのか。これは思いつかなかった。
Halo キーボード早く試したい。
ヒンジは相変わらずカッコイイ。