すべて反映するか、反映しないか
在庫を1減らす処理と注文を1件登録する処理を、一つのトランザクションにまとめます。両方成功したらコミットして確定します。
確定前に失敗して全体を取り消すのがロールバックです。部分的な変更だけを残さない性質を原子性と呼びます。
ここではDB内の更新を扱い、外部へのメール送信などまで自動で取り消せるという意味ではありません。
| ACID | 意味 | 注文の例で考えること |
|---|---|---|
| A:原子性 | 全部実行か、全部取り消しか | 在庫だけ減った状態を残さない |
| C:一貫性 | 制約を満たす状態を保つ | 在庫数などのルールを設計する |
| I:独立性・分離性 | 同時実行の影響を制御 | 同じ在庫の取り合いを調整 |
| D:耐久性 | 確定した結果を保持 | 確定済み注文を障害後も復旧可能にする |
同時に残り一つを見たら、どうなる?
二人が同時に在庫1を読み、それぞれ注文できると判断すると、売り越すおそれがあります。処理をトランザクションで囲むだけで、どんな実装でも安全になるわけではありません。
適切な分離レベルや排他制御、条件付き更新と結果の確認など、同時実行に対応した設計が必要です。排他制御では、同じ対象への更新を調整します。
ACIDは、信頼して処理するための性質
原子性は全体を一まとまりに反映する性質、一貫性は制約などの整合した状態を保つ性質、独立性(分離性)は同時実行の相互影響を制御する性質、耐久性は確定した結果を保持する性質です。誤った業務ルールをDBが自動で正すわけではありません。
ロールバックは確定済みの過去の操作をいつでも取り消せる機能でもありません。