第33話「振込のお金はどこへ?」
テクノロジ系 / データベース ── テーマ:トランザクション・ACID特性・排他制御・障害回復
▶ マンガで読む(無料・登録なし)この話で覚える用語(7語)
- トランザクションとらんざくしょん
- データベースに対する、切り離せない一連の処理のまとまり。「Aの口座から引く」と「Bの口座に足す」のように、全部成功するか全部取り消すかのどちらかにする。
- コミットこみっと
- トランザクションの処理がすべて成功したとき、その結果を確定させること。確定した結果はデータベースに反映される。
- ロールバックろーるばっく
- トランザクションが途中で失敗したとき、更新前の記録(ログ)を使って、処理を始める前の状態に戻すこと。
- ACID特性あしっどとくせい
- トランザクションが守るべき4つの性質。原子性(A)・一貫性(C)・独立性(I)・耐久性(D)の頭文字。
- 排他制御はいたせいぎょ
- 複数の処理が同じデータを同時に更新して矛盾が出ないよう、使っている間は他の処理に使わせない(ロックをかける)しくみ。
- デッドロックでっどろっく
- 複数の処理が、お互いに相手がロックしているデータの解放を待ち続け、どれも先に進めなくなった状態。
- ロールフォワードろーるふぉわーど
- ディスク障害などのとき、バックアップを戻したあと、更新後の記録(ログ)を使って障害直前までの更新をやり直し、状態を回復すること。
試験に出るポイント
- トランザクション=全部やるか、まったくやらないか
- コミット=「ファイナルアンサー!」で確定
- ロールバック=ゲームオーバーでセーブ地点からやり直し
- 振込は「半分だけ成功」が一番こわい。だからひとまとめ
- 原子性=全部実行か、まったく実行しないか
- 耐久性=確定した結果は障害が起きても消えない
- 途中で失敗 → ロールバック(更新前ログで戻す)
- ディスク故障 → ロールフォワード(バックアップ+更新後ログ)
- お互いのロック解除を待って進まない → デッドロック
確認クイズ(ITパスポート試験の形式)
- 原子性
- 一貫性
- 独立性
- 耐久性
答えと解説を見る
正解:ア 原子性
「全部か、ゼロか」は原子性(Atomicity)。一貫性は矛盾がないこと、独立性は同時に動いても影響しないこと、耐久性は確定した結果が消えないことです。
- 複数の処理が、互いに相手のロックの解除を待ち続けて先に進めなくなる状態
- 同じデータを同時に更新しないよう、使用中のデータを他の処理から使えなくすること
- トランザクションの処理結果を確定させること
- 障害時に、バックアップとログを使って更新をやり直すこと
答えと解説を見る
正解:ア 複数の処理が、互いに相手のロックの解除を待ち続けて先に進めなくなる状態
お互いに待ち合って止まるのがデッドロック。使用中のデータを使わせないのは排他制御、確定はコミット、ログで更新をやり直すのはロールフォワードです。
- ロールフォワード
- ロールバック
- コミット
- 排他制御
答えと解説を見る
正解:ア ロールフォワード
バックアップ+更新後ログで「早送り」するのがロールフォワード。ロールバックは途中で失敗したときに更新前ログで「巻き戻す」処理です。
マンガのセリフ(文字版)
家計簿アプリに送金機能を作ることに
ミライ「「Aさんから1万円引く」「Bさんに1万円足す」…この間でサーバが止まったら?」
ミライ「Aさんのお金は減ったのに、Bさんに届かない!?1万円が消える!!」
ツカサ先輩「大丈夫。その2つはトランザクションとしてひとまとめに扱うんだ」
ミライ「ひとまとめ…?」
ツカサ先輩「全部うまくいったらコミットで確定する」
ツカサ先輩「途中で失敗したらロールバックで、始める前の状態に戻す」
- トランザクション=全部やるか、まったくやらないか
- コミット=「ファイナルアンサー!」で確定
- ロールバック=ゲームオーバーでセーブ地点からやり直し
- 振込は「半分だけ成功」が一番こわい。だからひとまとめ
ツカサ先輩「トランザクションが守るべき4つの性質をACID特性という」
ミライ「アシッド(酸)…レモン味ですか?」
ツカサ先輩「味はない!4つの性質の頭文字 A・C・I・D だ」
ミライ「夫婦で同じ口座を、同時に更新したら?」
ツカサ先輩「片方が使う間、もう片方を待たせる。排他制御だ。トイレの鍵と同じだな」
ミライ「でも、2人がお互いの鍵を待ち合ったら…?」
ツカサ先輩「どちらも永遠に進めない。これがデッドロックだ」
部長「かんたんだ。鍵を全部捨てればデッドロックは起きん!」
ツカサ先輩「同時に書き換えて残高がメチャクチャになります!」
ツカサ先輩「鍵は残して、かける順番をそろえるんです」
もしもディスクが壊れたら――
ツカサ先輩「データベースは、更新の記録をログファイルに残している」
ツカサ先輩「バックアップを戻し、ログで更新をやり直す。これがロールフォワードだ」
ミライ「SNSの投稿みたいな大量のデータも、全部きっちりした表ですか?」
ツカサ先輩「量も形もバラバラなビッグデータには、表にこだわらないNoSQLも使う」
ミライ「送金は全部やるか、全部やらないか!これで1万円は消えません!」
ツカサ先輩「安心して作れるな」
- 原子性=全部実行か、まったく実行しないか
- 耐久性=確定した結果は障害が起きても消えない
- 途中で失敗 → ロールバック(更新前ログで戻す)
- ディスク故障 → ロールフォワード(バックアップ+更新後ログ)
- お互いのロック解除を待って進まない → デッドロック
部長「ワシのダイエットもロールバックした…元の体重に戻った…」
ミライ「それはただのリバウンドです!!」