原子性(トランザクションとコンピューティング)
原子性とは、一連の操作が単一の切り離せない単位として実行される保証であり、すべて成功するか、まったく実行されないかのどちらかです。トランザクション処理や耐障害性コンピューティングの基本特性です。
原子性とは、複数の処理が不可分であるという性質を指します。外部の観察者からは、システムはその処理群が始まる前の状態から、処理群が完了した後の状態へ直接移行したように見え、その途中の部分的な状態は見えません。コンピューティングでは、この概念はデータベースやストレージシステムにおけるトランザクションの文脈で最もよく語られ、原子性はACIDの4特性の最初の1つとして現れます。現代のデータベースシステムやトランザクションプログラムは、論理的な正しさを確保し、エラー処理を簡単にするために原子性に依存しています。
原子性が保証するもの
原子性は「全部実行するか、まったく実行しないか」を意味します。トランザクション内のすべての手順が完了すれば、そのトランザクションはコミットされ、その効果は残ります。いずれかの手順が失敗した場合はロールバックされ、システムはトランザクション開始前に存在していた状態に戻ります。一般的に見える仕組みはコミットとロールバックです。実装技法には、ログ記録(undo/redo)、ジャーナリング、クラッシュ後に部分更新を取り消せるように書き込み順序を慎重に制御する方法などがあります。身近な例としては、2つの口座間で送金する場合が挙げられます。引き落としと入金が両方行われるか、どちらも行われないかのいずれかです。
実装方法
- 先行書き込みログとトランザクションログにより、システムは変更を適用する前に意図した内容を記録でき、障害後の回復が可能になります。
- ロックと並行制御は、トランザクション実行中の競合更新を防ぎます。分離性と原子性は密接に関係しています。
- 分散システムでは、複数ノードにまたがる原子性を得るために、2相コミットのような協調的なコミット手順が用いられますが、遅延やブロッキングの問題を伴います。
- 厳密な原子性が現実的でない場合、アプリケーション側のロジックで部分的な処理を打ち消す補償トランザクションが使われることがあります。
多くのストレージエンジンやリレーショナルデータベースは、原子トランザクションをネイティブに実装しています。一方、現代のNoSQLシステムの一部は、一貫性を可用性や性能と引き換えにするため、変種やより弱い保証を提供します。
歴史と背景
原子トランザクションの重要性は、1970年代から1980年代にかけてのデータベース研究で明確にされ、その後ACIDモデルとして定式化されました。ACIDは、Atomicity、Consistency、Isolation、Durabilityを形式化したものです。ACIDという用語とトランザクション技術は、トランザクション処理システムが業務上重要なアプリケーションで重要性を増すにつれて、データベース研究者や実務家によって発展し、広く普及しました。
実務上のトレードオフと区別
厳密な原子性はアプリケーションロジックを単純化しますが、その代わりにコストも伴います。たとえば、遅延の増加、分散環境での調整増大、拡張性の制約などです。多くのサービスにまたがる絶対的な原子性が実現困難な場合、設計者は最終的整合性や冪等な操作パターンを選ぶことがあります。原子性は関連概念とも区別する必要があります。分離性は同時実行トランザクションの相互作用を制御し、耐久性はコミット済みの変更がクラッシュ後も残ることを保証し、冪等性は繰り返し実行しても同じ効果になることを意味します。
トランザクションとACIDモデルの簡潔な入門としてはACIDを、トランザクション障害と回復の実例についてはトランザクションに関する文献やチュートリアルを参照してください。
関連項目
著者
AlegsaOnline.com 原子性(トランザクションとコンピューティング) Leandro Alegsa
URL: https://ja.alegsaonline.com/art/7057