銀行アプリで、ある口座から別の口座へ送金する処理をDynamoDBで実装します。要件は「①送金元の残高を減らす更新と送金先の残高を増やす更新を、両方成功するか両方失敗するかのいずれかにする ②送金元の残高が不足している場合は処理全体を失敗させる」です。最も適切な実装はどれですか。
TransactWriteItemsは複数アイテムへの書き込みをACID特性を持つ単一トランザクションとして実行し、すべて成功するかすべて失敗するか(all-or-nothing)を保証します。各オペレーションにConditionExpressionを付けられるため、送金元の更新に残高チェック条件を加えれば、残高不足時はトランザクション全体がキャンセルされます。両要件を満たします。 選択肢Aの手動ロールバックはロールバック自体が失敗するリスクがあり原子性を保証できない。 選択肢CのBatchWriteItemは複数書き込みをまとめるが原子性は保証せず、ConditionExpressionも使えず一部のみ成功し得る。 選択肢DのStreams経由の非同期補正は結果整合で、処理中に不整合状態が露出し失敗時の全体ロールバックも保証できない。