トランザクション内の処理がすべて実行されるか全く実行されないかのどちらかになる性質。
原子性(Atomicity)とは、トランザクション(=ひとまとまりとして扱う一連の処理)の中身が、すべて実行されるか、まったく実行されないかのどちらかになる性質のことです。途中だけ実行された中途半端な状態は残しません。
身近な例で考えると、銀行の送金がぴったりです。「Aの口座から引く」「Bの口座に足す」という2つの処理は、どちらも成功しないと意味がありません。片方だけ実行されたら、お金が消えたり勝手に増えたりしてしまいます。だからこの2つを「分けられない(=原子=それ以上分割できない最小単位)ひとかたまり」として扱うのです。
上のツールで▶ボタンを押すと、送金処理が全部成功して確定する流れと、途中で障害が起きて全部取り消される流れの2つを切り替えて確認できます。
原子性はよく 「All or Nothing(全か無か)」 という言葉で表されます。トランザクションの結果として許されるのは、次の2つのどちらかだけです。
・All(全部実行):トランザクション内のすべての処理が成功し、その結果が確定される
・Nothing(まったく実行しない):1つでも失敗したら、行った変更をすべて取り消して開始前の状態に戻す
送金の例でいうと、許される結果は「Aから引いてBに足した状態(All)」か「AもBも変わっていない状態(Nothing)」のどちらかです。「Aから引いたのにBには足されていない」という状態は、お金が消えてしまうので絶対に作りません。これが原子性のいちばん大事なポイントです。
料理に例えると、レシピの手順を1つでも飛ばしたら、その料理は「作りかけ」ではなく「最初から作らなかった」ことにして材料を片付ける、というイメージです。中途半端な皿はお客に出さない、という考え方です。
原子性の「Nothing(まったく実行しない)」を実現する仕組みが ロールバック(=処理を取り消して開始前の状態に戻す操作) です。トランザクションの途中で障害が起きたとき、それまでに行った変更をすべて巻き戻します。
逆に、すべての処理が成功した場合は コミット(=変更を確定する操作) を行い、結果を正式な記録として書き込みます。つまり原子性は、次の2つの操作によって守られています。
・コミット:全部成功 → 変更をまとめて確定(All を実現)
・ロールバック:途中で失敗 → 変更をすべて取り消し(Nothing を実現)
DBMS(=データベース管理システム)は、変更を確定する前にどんな処理をしたかをログ(記録)に残しておきます。障害が起きたら、このログを見て「どこまで戻せばよいか」を判断し、ロールバックを実行します。上のツールの失敗シナリオで、Aから引いた7000円が元の10000円に戻る様子を確認してみてください。