トランザクションの「ACID特性」を理解する

トランザクションの「ACID特性」を理解する

トランザクション。
一連の処理を一つのまとまった単位として扱う仕組みのことです。
データベースが絡む処理でよく聞くものですが、
信頼性と整合性を保証するための満たすべき4つの特性があり、
それらの頭文字を取って「ACID特性」と呼ばれます。
今回はこの4つの特性を具体例を交えながら解説します。
硬い話にならないようゲームでの例を挙げているので、
業界外の方でも分かりやすいかと思います。

原子性(Atomicity)

トランザクション内の処理は
「全て成功するか、全てなかったことにするか」
のどちらかになります。
途中で失敗が起きると、トランザクション開始前の状態まで一気に巻き戻されます。

具体例:
オンラインRPGでキャラクターがアイテム合成を行う場合、
必要素材の消費と新アイテム生成を一つのトランザクションにまとめます。
素材消費だけ成功して生成に失敗したら、消費も合成もなかったことに戻します。

一貫性(Consistency)

トランザクション開始前後で、
データベースのルールや制約を常に満たす状態を維持します。
整合性制約(外部キー制約や一意制約など)を壊さないことが要件です。

具体例:
MMORPGで「所持ゴールドはマイナスになってはいけない」という制約を持つとします。
プレイヤーがギルド税を支払うクエスト報酬を受け取る処理で、
税額を差し引いた後の所持ゴールドが負になる場合、
トランザクション全体が拒否されて支払いも報酬受領も行われません。

独立性(Isolation)

複数のトランザクションが同時に動いても
相互の処理結果に干渉を起こさないようにします。
分離レベルを調整し一時的に他の処理を見えなくすることで
データの不整合を防ぎます。

具体例:
オンラインゲーム内ショップで残り在庫1のポーションを、
プレイヤーAとプレイヤーBが同時に購入操作をしたとします。
サーバは一方の購入処理を先にコミットし、
もう一方は在庫切れエラーとして弾くと、
二重販売や二重課金を防ぐことができます。

永続性(Durability)

トランザクションがコミットされた後、
その結果は障害が起きても消えずに保持されます。
ディスクへの書き込みやログの保管などにより、
再起動後もデータが復元可能です。

具体例:
シングルプレイRPGでセーブポイントに到達した瞬間に、
進行状況がローカルファイルやクラウドストレージに書き込み完了するようにします。
その直後に電源断やアプリ異常終了が発生しても、
再起動後には必ず直前のセーブ状態から再開できます。

まとめ

リーダーや設計担当など、
何かを判断しなければいけない立場になった時に、
こういった細かい知識がその助けになります。
出会った言葉や技術だけでも理解を深める努力をしたいですね。