DVA-C02開発EASY単一選択

あるスタートアップが、DynamoDBテーブルに対してアイテムの条件付き更新を実装しようとしている。在庫数が0より大きい場合のみ在庫を1減算し、0以下の場合はエラーを返す仕組みを最小限のコード変更で実現したい。最も適切なアプローチはどれか。

  1. A. TransactWriteItemsを使い、GetItemとUpdateItemを1つのトランザクションにまとめる
  2. B. UpdateItemのConditionExpressionに「stock > :zero」を指定し、条件不一致時はConditionalCheckFailedExceptionをキャッチして処理する
  3. C. DynamoDB Streamsを有効化し、ストリームのLambdaで在庫超過の更新を検知してロールバックする
  4. D. UpdateItemを呼び出す前にGetItemで現在の在庫数を取得し、アプリケーション側でチェックしてからUpdateItemを呼び出す
解答と解説を見る

正解: B

DynamoDBのConditionExpressionは、指定した条件が真の場合のみ書き込みを実行するアトミック操作であり、条件不一致時はConditionalCheckFailedExceptionがスローされる。これにより読み取りと書き込みの間に別のプロセスが在庫を変更するレースコンディションを防げる。Dは読み取りと書き込みの間にレースコンディションが生じ、在庫が負になる可能性がある。Cは変更後の検知でロールバックする方式は複雑でレイテンシも高く、在庫が一時的に負になるウィンドウが存在する。AのTransactWriteItemsでGetItemとUpdateItemを組み合わせる方法はトランザクション内にGetItemを含められないため(TransactGetItemsとTransactWriteItemsは別API)、この用途には適さない。

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