【IT用語】アトミック性(原子性)とは?データベース・プログラミングでの意味を解説!

「この処理はアトミックにしたい」「この更新はアトミックですか?」

ITの会話では、このように「アトミック」という言葉が使われることがあります。

アトミック性(原子性)は、「データベースの更新」や「プログラミングで共有データを操作する場面」などで使われる言葉です。

この記事では、「アトミック」について以下の内容をわかりやすく説明します。

  • アトミック性の意味
  • データベース・プログラミング・Gitでの具体例
  • ACID特性との関係
  • 会話で「アトミック」が出てきたときの確認ポイント

アトミック性(原子性)とは?

アトミック性(原子性)とは?

アトミック性(原子性)は、使われる場面によって、次のように説明できます。

  • データベースの場合
    • 一連の変更を「すべて反映するか、すべて反映しないか」にする性質です。
    • 例えば、送金で「引き落としだけが反映され、入金されない」という状態を防ぎます。
  • プログラミングで複数の処理が同じデータを操作する場合
    • 対象の操作を、ほかの処理から見て分割できない1つの操作として行える性質です。
    • 例えば、共有カウンターの値を1増やすときに、読み取りから書き込みまでをひとまとまりとして扱います。

共通するのは、対象となる処理をひとまとまりとして扱うという考え方です。この性質を持つ操作を「アトミックな操作」と呼びます。

データベースでのアトミック性(原子性)

データベースでのアトミック性(原子性)

データベースでのアトミック性(原子性)は、一連の変更を「すべて反映するか、すべて反映しないか」にする性質です。

分かりやすい例が、銀行口座間の送金です。

AさんからBさんへ1,000円を送金する場合、次の2つの更新が必要になります。

  • Aさんの残高を1,000円減らす
  • Bさんの残高を1,000円増やす

ここで、Aさんの残高だけが減り、Bさんの残高が増える前に処理が失敗すると、送金が中途半端な状態になってしまいます。

そこで、2つの更新を同じトランザクションにまとめます。

この場合、変更の結果は次のどちらかになります。

結果Aさんの残高Bさんの残高
変更を確定する1,000円減る1,000円増える
変更を取り消す変更を反映しない変更を反映しない

変更を確定することを「コミット」、変更を取り消すことを「ロールバック」と呼びます。

途中まで更新していても、トランザクション全体を取り消せば、そのトランザクションによる変更は残りません。

このように、一連の変更を「すべて反映するか、すべて反映しないか」にするのが、トランザクションのアトミック性(原子性)です。

会話で「この2つの更新はアトミックにしたい」と言われたら、この場面では「片方だけが反映される状態を避けたい」という意味だと理解できます。

あわせて読みたい

「ロールバック」については、以下の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

プログラミングでのアトミック性(原子性)

プログラミングでのアトミック性(原子性)

共有データを扱うプログラミングでのアトミック性(原子性)は、対象の操作を、ほかの処理から見て分割できない1つの操作として行える性質です。

例えば、共有しているカウンターの値を1増やす操作を考えてみましょう。

単純な操作に見えますが、概念的には次の手順に分けられます。

  • 現在の値を読み取る
  • 読み取った値に1を足す
  • 計算結果を書き込む

この手順がひとまとまりとして保護されていないと、次のようなことが起こり得ます。

順番処理A処理B
1現在の値「10」を読む
2現在の値「10」を読む
3「11」を書き込む
4「11」を書き込む

2回増やしたので期待する値は「12」ですが、結果は「11」になっています。処理Aと処理Bが同じ値を読み、それぞれ「11」を書き込んでしまったためです。

このような問題を防ぐ方法の1つが、読み取り・計算・書き込みをまとめたアトミックな加算操作です。

両方の処理が同じカウンターに対してアトミックな加算操作で1を足せば、一方の加算結果をもう一方が上書きしてしまうことを防げます。

この例では、片方の加算で「10」から「11」になり、もう片方の加算で「11」から「12」になります。どちらが先に加算しても、結果は「12」です。

トランザクション処理のACID特性の「A」

トランザクション処理のACID特性の「A」

データベースにおけるアトミック性(原子性)は、トランザクション処理のACID特性の「A」に当たります。

トランザクションとは、データベースで行う1つ以上の処理を、1つのまとまりとして扱う単位です。

ACIDは、トランザクション処理における次の4つの性質の頭文字を取った言葉です。

頭文字英語日本語
AAtomicityアトミック性(原子性)
CConsistency一貫性
IIsolation分離性(独立性)
DDurability耐久性(永続性)

このうちアトミック性(原子性)は、トランザクション処理に含まれる一連の変更を「すべて反映するか、すべて反映しないか」にする性質です。一部の変更だけが反映される状態を防ぎます。

Gitにもアトミックという言葉がある

Gitのgit pushにも、--atomicオプションがあります。

これは、1回のpushで更新対象となる接続先のブランチやタグなどについて、すべて更新するか、エラー時にはどれも更新しないかにするものです。

例えば、2つのブランチをまとめてpushするときに、一方を更新できない場合は、もう一方も更新しません。

ただし、接続先のサーバーがアトミックなpushに対応していない場合、pushは失敗します。

会話で「アトミック」が出てきたら

会話でアトミックの意味をつかむには、「どこからどこまでを1つの操作として扱いたいのか」に注目すると分かりやすくなります。

例えば、次のように確認できます。

  • 「片方だけ更新される状態を避けたい、という意味ですか?」
  • 「読み取りから書き込みまでを、ひとまとまりにしたいということですか?」
  • 「アトミックにする範囲は、この2つの更新ですか?」

「アトミック」という言葉だけで判断せず、対象となる処理と保証される範囲を確認すると、会話の意図を理解しやすくなります。

本記事のまとめ

この記事では「アトミック性(原子性)」について、以下の内容を説明しました。

  • データベースの原子性は、一連の変更をすべて反映するか、すべて反映しないかにする性質で、ACID特性の「A」に当たる。
  • 共有データを扱うプログラミングでは、対象の操作を、ほかの処理から見て分割できない1つの操作として行える性質を指す。
  • Gitのgit push --atomicは、更新対象のブランチやタグなどを、すべて更新するか、エラー時にはどれも更新しないかにする。
  • 「アトミック」という言葉が使われたら、対象となる処理と保証される範囲を確認する。

お読みいただきありがとうございました。

スポンサーリンク