DVA-C02開発MEDIUM単一選択

あるマーケットプレイス企業が、DynamoDBを使って注文管理システムを構築している。注文処理では「在庫テーブルから在庫を減算」と「注文テーブルに注文レコードを作成」を原子的に実行しなければならない。どちらか一方だけが成功した状態は許容されない。最も適切な実装方法はどれか。

  1. A. 在庫テーブルのUpdateItemとConditionExpressionを実行し、成功したら注文テーブルにPutItemする。失敗した場合はアプリケーション側でロールバックする
  2. B. DynamoDB TransactWriteItemsを使い、ConditionCheck(在庫確認)・Update(在庫減算)・Put(注文作成)を1つのトランザクションにまとめる
  3. C. DynamoDB Streamsで在庫テーブルの変更を検知し、Lambdaが注文テーブルにレコードを作成するイベント駆動アーキテクチャにする
  4. D. 両テーブルを単一テーブルデザインに統合し、1回のPutItemで在庫と注文を同時更新する
解答と解説を見る

正解: B

DynamoDB TransactWriteItemsは最大100アイテムの複数テーブルにまたがる書き込みをACIDトランザクションとして実行できるAPIである。ConditionCheckで在庫確認、Updateで在庫減算、Putで注文作成を1トランザクションにまとめることで、どれか1つが失敗すると全体がロールバックされる原子性が保証される。Aの逐次実行+手動ロールバックは、在庫減算成功後の注文作成失敗時にロールバックが失敗した場合に在庫と注文の不整合が残る。また並行リクエストがある場合は在庫の二重減算も発生し得る。CのStreams+Lambdaはイベント駆動の結果整合性パターンで、原子性は保証されず、エラー時の補償トランザクション実装が別途必要になる。D単一テーブルデザインへの統合は「在庫が足りない場合の部分的な失敗防止」という要件に直接は対応できず、データモデルの大改修が必要で現実的ではない。

▸ この試験を本気で演習する(全150問・無料)