FE EXAM

原子性(Atomicity)

トランザクション内の処理がすべて実行されるか全く実行されないかのどちらかになる性質。

INTERACTIVE VISUALIZATION
作業中
確定
取消
フェーズ
idle
合計金額
15,000円
結果
処理中
シナリオ
ステップ1 / 6
STEP 1/6送金する前の状態A口座(送金元)に10000円、B口座(送金先)に5000円あります。これからAからBへ3000円を送金します。送金は「Aから3000円引く」「Bに3000円足す」という2つの処理に分かれます。トランザクション(=ひとまとまりの処理)とは、この2つを「ひとかたまり」として扱う単位のことです。
トランザクション(ひとまとまりの処理)A口座(送金元)作業中の残高10,000円確定済み(ディスク)10,000円一致(確定済み)B口座(送金先)作業中の残高5,000円確定済み(ディスク)5,000円一致(確定済み)
解説

📌
原子性とは

全部実行(All)全部取消(Nothing)このどちらかだけ。中途半端はナシ

原子性(Atomicity)とは、トランザクション(=ひとまとまりとして扱う一連の処理)の中身が、すべて実行されるか、まったく実行されないかのどちらかになる性質のことです。途中だけ実行された中途半端な状態は残しません。

身近な例で考えると、銀行の送金がぴったりです。「Aの口座から引く」「Bの口座に足す」という2つの処理は、どちらも成功しないと意味がありません。片方だけ実行されたら、お金が消えたり勝手に増えたりしてしまいます。だからこの2つを「分けられない(=原子=それ以上分割できない最小単位)ひとかたまり」として扱うのです。

上のツールで▶ボタンを押すと、送金処理が全部成功して確定する流れと、途中で障害が起きて全部取り消される流れの2つを切り替えて確認できます。

⚖️
All or Nothingの意味

原子性はよく 「All or Nothing(全か無か)」 という言葉で表されます。トランザクションの結果として許されるのは、次の2つのどちらかだけです。

All(全部実行):トランザクション内のすべての処理が成功し、その結果が確定される
Nothing(まったく実行しない):1つでも失敗したら、行った変更をすべて取り消して開始前の状態に戻す

送金の例でいうと、許される結果は「Aから引いてBに足した状態(All)」か「AもBも変わっていない状態(Nothing)」のどちらかです。「Aから引いたのにBには足されていない」という状態は、お金が消えてしまうので絶対に作りません。これが原子性のいちばん大事なポイントです。

料理に例えると、レシピの手順を1つでも飛ばしたら、その料理は「作りかけ」ではなく「最初から作らなかった」ことにして材料を片付ける、というイメージです。中途半端な皿はお客に出さない、という考え方です。

↩️
ロールバックとの関係

開始処理①障害ロールバックで開始時点へ戻す

原子性の「Nothing(まったく実行しない)」を実現する仕組みが ロールバック(=処理を取り消して開始前の状態に戻す操作) です。トランザクションの途中で障害が起きたとき、それまでに行った変更をすべて巻き戻します。

逆に、すべての処理が成功した場合は コミット(=変更を確定する操作) を行い、結果を正式な記録として書き込みます。つまり原子性は、次の2つの操作によって守られています。
コミット:全部成功 → 変更をまとめて確定(All を実現)
ロールバック:途中で失敗 → 変更をすべて取り消し(Nothing を実現)

DBMS(=データベース管理システム)は、変更を確定する前にどんな処理をしたかをログ(記録)に残しておきます。障害が起きたら、このログを見て「どこまで戻せばよいか」を判断し、ロールバックを実行します。上のツールの失敗シナリオで、Aから引いた7000円が元の10000円に戻る様子を確認してみてください。

練習問題

🎯
基本情報技術者 練習問題

Q1.トランザクションの原子性(Atomicity)の説明として最も適切なものはどれか。
A.トランザクション内の処理がすべて実行されるか、まったく実行されないかのどちらかになる
B.複数のトランザクションが互いに干渉しないように分離される
C.コミット済みの結果が障害後も失われない
D.実行の前後でデータベースの整合性が保たれる
Q2.送金処理の途中で障害が発生したとき、原子性を守るために行われる操作はどれか。
A.コミットして途中までの変更を確定する
B.ロールバックしてトランザクション内の変更をすべて取り消す
C.失敗した処理だけをやり直す
D.残高を強制的にゼロにする
Q3.原子性が守られていない場合に起こりうる状態はどれか。
A.AからもBからも何も変更されない
B.AとBの両方が正しく更新される
C.Aから引かれたのにBには足されず、お金が消える
D.コミット後に結果が確実に保存される

関連コンテンツ