デッドロック回避方法

デッドロックが発生していることを検出する方法

1.2 相ロック

 トランザクション処理で必要になったデータにその都度ロックをかけ
   必要となる全てのロックを獲得した後にだけロック解除ができる方式

   並行に実行されるすべてのトランザクションが2相ロックに従うことで、
     すべてのデータアクセスが直列化され、
     途中で他のトランザクションにデータを書き換えられ
     処理に矛盾を生じるデータの不整合を避ける

 具体的な動き
   必要なデータすべてのロックを取得し、その後にロックを解放し始める
     2つの段階が分かれていることで、
     データの矛盾を防ぎ、トランザクションの直列化可能性を保証する

2.時刻印アルゴリズム

 トランザクションの開始時、データ読取り・書出し時などの時刻を記録する
   複数のトランザクションが競合した際、
   タイムスタンプにより、最初に実行されたトランザクションを特定し、
   これを先に実行するよう、
   他の全てのトランザクションをロールバックした後、再実行する

   競合が多発するとスループットが低下しやすいため、
   トランザクション間で共有する資源が少ない場合に有効

3.待ちグラフ

 実行中のトランザクションを各ノード、
   データのアンロック待ちの様子を矢印で表現したグラフで、
   デッドロックの検出に使用する

   X→Yは、
     トランザクションXが
     トランザクションYがロックしている資源のアンロックを待っている
     待ちグラフ内に閉路があればデッドロックが発生していると判断する

     DBMSはいずれかのトランザクションを強制的にアボートさせることで
     デッドロックを解消する

デッドロックの判別

 具体的なデッドロックの見分け方
   サイクルがあるとデッドロックが発生する
   サイクルがないとデッドロックにはならない

   上記の例だと
     B,C,Dでサイクルがあるでデッドロックが発生する
     FはDの資源開放を待つので、デッドロックの状態になる