DVAAWSのサービスを使用した開発
送金機能で、ある口座アイテムの残高から減算し、別の口座アイテムの残高へ加算する処理を実装します。要件は「①両方の更新が全て成功するか全て失敗する(原子性)
②送金元の残高が送金額以上の場合のみ実行する条件チェック」です。最も適切なDynamoDB APIはどれですか。
ATransactWriteItemsを使用し、各Update操作に条件式を指定して2つの更新を1つのトランザクションで実行する
✓ 正解
TransactWriteItemsは複数アイテムの書き込みを全成功か全失敗の原子的トランザクションとして実行し、各操作に条件式を付与できます。残高チェックと2アイテムの整合的な更新を同時に満たせる唯一の選択肢です。
BBatchWriteItemを使用し、2つのアイテムの更新を1回のリクエストで一括して書き込む
BatchWriteItemはPutItemとDeleteItemのみを扱い、Updateや条件式に対応しません。さらに各書き込みは独立処理で部分的に失敗し得るため原子性がなく、残高条件チェックも実装できず要件を満たしません。
C2回のUpdateItemを連続して呼び出し、それぞれに残高を検証する条件式を指定して実行する
連続したUpdateItemは各呼び出しが独立したトランザクションで、まとめてのロールバックができません。1件目が成功し2件目が失敗すると送金元だけ減算され残高不整合が発生するため、原子性要件を満たしません。
DDynamoDB Streamsを有効化し、減算アイテムの変更イベントをトリガーに加算処理を実行する
DynamoDB Streamsは変更を非同期かつ結果整合で配信する仕組みで、減算と加算がアトミックに行われません。途中失敗時に減算をロールバックする保証もなく、強い整合性が必要な送金処理には不適切です。
解説
TransactWriteItemsは、最大100アイテムの書き込み(Put/Update/Delete/ConditionCheck)を単一の原子的トランザクションとして実行するAPIです。
含まれる全操作が成功するか、いずれかが失敗すれば全てロールバックされ、部分的な適用は起こりません。
各操作にConditionExpressionを付けられるため、送金元の残高チェックも同一トランザクション内で実現でき、要件①②を同時に満たします。
選択肢のBatchWriteItemはPut/Deleteのみで条件式が使えず、部分的失敗が起こり原子性もありません。
選択肢の連続UpdateItemは各呼び出しが独立しており、1つ目成功・2つ目失敗で不整合になります。
選択肢のStreamsは非同期かつ結果整合で、原子性も失敗時のロールバックも保証されません。
ドメイン別正答率・予想スコアでリアルタイムに実力把握
無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。
無料で演習を始める →