複数の処理が同時に同じデータを更新しても矛盾が生じないよう、更新中のデータには 他の処理が手を出せないようにする排他制御を行っているデータベースがある。 ここで起こりうるデッドロックの説明として、最も適切なものはどれか。
正解:ウ
ア排他制御をしなかったために、先に書き込まれた更新が後の更新で失われること。
誤り。排他制御を行わなかったときに起きる更新の消失です。デッドロックとは 逆に、待たせなかったせいで生じる不具合です。排他制御はこれを防ぐために あり、デッドロックはその排他制御に伴って起こります。
イ待たされていた処理が、先の処理の終了によって解放され、続きを実行できること。
誤り。排他制御が正常に働いているときの、ふつうの順番待ちです。待ちは 発生しますが、先の処理が終われば必ず解消します。デッドロックは この待ちが解消しなくなった状態を指します。
ウ二つの処理が互いに相手の確保したデータの解放を待ち続け、どちらも進めないこと。
正解。待つ相手が輪になってしまい、どちらも自分の分を解放できないため、 放っておけば永久に終わりません。排他制御の副作用として起こります。
エ一つのデータに更新処理が集中し、順番待ちが増えて全体の応答が遅くなること。
誤り。ロックの競合による性能の低下です。混雑して遅いだけで、順番が 回ってくれば処理は進みます。止まっているのか、遅いだけなのかが デッドロックとの分かれ目です。
順番待ちの向きが輪になると、誰も進めない
二人で工作をしていて、一方がはさみを、もう一方がのりを握ったまま、 互いに相手の道具が空くのを待っている。二人とも手放さないので、いつまでも 作業が進みません。データベースで起きるデッドロックは、まさにこれです。
排他制御とデッドロックの関係
同じデータを複数の処理が同時に書き換えると、一方の更新が消えるなどの矛盾が 生じます。それを防ぐのが**排他制御(同時実行制御)**で、更新中のデータには 鍵を掛け、他の処理を順番待ちにします。
ふつうの順番待ちは、先の処理が終われば解けます。ところが、
- 処理Xが商品Aを確保したまま、商品Bが空くのを待つ
- 処理Yが商品Bを確保したまま、商品Aが空くのを待つ
という具合に待つ向きが互いを指すと、どちらも先へ進めず、待ちが永久に 解けません。排他制御があるからこそ起きる副作用という位置づけです。 実際のデータベース管理システムは、この状態を検知して片方の処理を 取り消すなどして解消します。
混同しやすい状態との違い
| 状態 | 何が起きているか |
|---|---|
| 排他制御 | 矛盾を防ぐため、更新中のデータを他の処理に触らせない仕組み |
| ロック待ち | 順番待ち。先の処理が終われば解消する |
| デッドロック | 待つ相手が互いを指し、待ちが解消しない |
| 更新の消失 | 排他制御をしなかったために、更新が上書きされて消える |
試験では「互いに」「待ち続ける」という言い回しが手がかりです。単に遅い、 単に待たされているだけの記述はデッドロックではありません。