
126
2つの処理が競合して
処理が止まる問題
4-17
複数のトランザクション処理が同時に同じデータを操作することで、互
いに相手の処理終了を待つ状態となり、次の処理へ進めなくなってしまう
ことをデッドロックと呼びます。
銀行口座の例で考えてみます。A口座と B口座に 10 万円ずつ入っている
状態で図4-33 のような「A口座からB口座に10 万円の送金を行うアクシ
ョン」と「B口座から A口座に 10万円の送金を行うアクション」が同時に
実行されたとします。まず1-1 の「A口座の預金をマイナス10 万円にす
る」という処理が実行されると、コミットが行われるまでA 口座のデータ
はロックされた状態となります。このようにトランザクション中の処理に
関わるデータは一時的にロックされます。もし
されます。その後1-2 が実行される前に、2-1の「B口座の預金を
マイナス10 万円にする」が実行されました。同様にしてB口座のデータ
がロックされます。すると、2 つのトランザクションがお互いに相手が操
作したいデータをロックしていて1-2 と 2-2 の処理を進められず、どちら
のアクションも止まってしまいました。これがデッドロックです。
デッドロックが起こった場合、させなければ
なりません。データベース管理システムによっては自動的にデッドロック
を監視して、ロールバックを行うしくみもありますが、そもそもデッドロ ...