無限ノック › DVA 練習問題一覧 › 問題
DVAAWSのサービスを使用した開発

銀行アプリで、ある口座から別の口座へ送金する処理をDynamoDBで実装します。要件は「①送金元の残高を減らす更新と送金先の残高を増やす更新を、両方成功するか両方失敗するかのいずれかにする ②送金元の残高が不足している場合は処理全体を失敗させる」です。最も適切な実装はどれですか。

A
2回のUpdateItemを順に実行し、2回目が失敗したら1回目をアプリケーション側で手動ロールバックする
2回のUpdateItemと手動ロールバックでは、ロールバック処理自体の失敗やクラッシュで不整合が残るリスクがあり、原子性を保証できません。条件チェックと組み合わせても堅牢な送金処理にはなりません。
B
TransactWriteItemsで2つのUpdateを1トランザクションにまとめ、送金元更新にConditionExpressionで残高チェックを付ける
✓ 正解
TransactWriteItemsは複数更新をACIDな単一トランザクションとして原子的に処理し、all-or-nothingを保証します。送金元更新にConditionExpressionで残高チェックを付ければ不足時に全体がキャンセルされ、両要件を厳密に満たせます。
C
BatchWriteItemで2つのPutItemをまとめて送信し、原子的に更新する
BatchWriteItemは複数のPut/Deleteをまとめて効率化しますが、トランザクションではなく一部だけ成功し得ます。ConditionExpressionも使えず残高チェックができないため、送金の整合性要件を満たせません。
D
各更新をDynamoDB Streamsでトリガーし、Lambdaで整合性を非同期に補正する
DynamoDB Streamsによる非同期補正は結果整合で、処理途中に残高の不整合が一時的に露出します。失敗時に送金全体を即座にロールバックする保証もなく、金融トランザクションには不適切です。

解説

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

ドメイン別正答率・予想スコアでリアルタイムに実力把握

無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。

無料で演習を始める →
← DVA の問題一覧に戻る