データベースサーバーのテーブルのデータ(共同口座)に、複数のユーザが同時アクセスする場合の問題点:
排他制御無し: A氏とB氏の処理を同時に実行できてしまうと、大問題が発生する。
元々、3万円の残高の口座から、1万円引き落とすと同時に、1万円預け入れる、場合の例)
処理順序 | A氏の画面 | 共同口座残高 | B氏の画面 | ||
1 | 残高3万円 | ←読み出し← | 3万円 | ||
2 | →読み出し→ | 残高3万円 | |||
3 | −1万円引落とし | +1万円預金 | |||
4 | 4万円 | ←書き込み← | 残高4万円 | ||
5 | 残高2万円 | →書き込み→ | 2万円 |
シミュレーション1:
排他制御有り: A氏とB氏の処理は同時出来ない様に制御する。つまりリソースを同時に利用しないように制御する。
リソースを利用する為に必要なロックを用意し、ロックの取得と開放によりリソースの利用者を制限する。
処理順序 | A氏の画面 | 共同口座残高 | B氏の画面 | ||
1 | 共同口座の利用開始 | ←ロック取得← | 3万円 | ||
2 | 残高3万円 | ←読み出し← | ロック取得失敗 | 口座は現在利用中 | |
3 | ロック開放待ち | ||||
4 | −1万円引落とし | ロック開放待ち | |||
5 | ロック開放待ち | ||||
6 | 残高2万円 | →書き込み→ | 2万円 | ロック開放待ち | |
7 | 共同口座の利用終了 | →ロック開放→ | ロック開放待ち | ||
8 | →ロック取得→ | 共同口座の利用開始 | |||
9 | →読み出し→ | 残高2万円 | |||
10 | +1万円預金 | ||||
11 | 3万円 | ←書き込み← | 残高3万円 | ||
12 | ←ロック開放← | 共同口座の利用終了 |
シミュレーション2: