デッドロック
でっどろっく
ひとことで言うと
複数のトランザクションが互いにリソースの解放を待ち続け、処理が永久に進まなくなる状態。
解説
複数のトランザクションが互いに相手が保持しているリソースの解放を待ち続け、処理が永久に進まなくなる状態。例えば、トランザクションAがリソース1をロックしてリソース2を要求し、同時にトランザクションBがリソース2をロックしてリソース1を要求する場合に発生する。DBMSはデッドロックを検知すると、一方のトランザクションを強制的にロールバックして解消する。
くわしく解説
デッドロックとは、2つ以上のトランザクションが互いに相手の保持するリソースを要求し合い、どちらも処理を進められなくなる膠着状態のことである。例えばトランザクションAがリソース1を確保してリソース2を要求し、同時にトランザクションBがリソース2を確保してリソース1を要求した場合、両者が永遠に待ち続けるデッドロックが発生する。対策としては、リソースの要求順序を統一する方法、タイムアウト検知によって一方のトランザクションを強制終了してロールバックする方法、ウェイトフォーグラフによる検出などがある。DBMSはデッドロックを自動検出し、一方のトランザクションを犠牲者として選択し強制ロールバックすることで解消する。デッドロックはデータベースの並行制御において必ず学習すべき重要概念であり、発生条件と解消方法が試験で問われる。
具体例で考えよう
倉庫管理システムで担当者AとBが同時に在庫更新を行う際、Aが商品Xをロックして商品Yを待ち、BがYをロックしてXを待つ状況が発生し、システムが先に進めなくなるケース。
試験対策ポイント
デッドロックの発生条件(相互待ち)と解消方法(タイムアウト・ロールバック)が頻出。ライブロック(処理は動いているが進まない)との違い、排他制御・共有ロックとの関連も整理すること。