DVAAWSのサービスを使用した開発
銀行振込機能をDynamoDBで実装しています。振込処理では「送金元アカウントの残高を減らす」「送金先アカウントの残高を増やす」という2つのテーブル更新を、必ず両方成功するか両方失敗するアトミックな操作として実装する必要があります(部分的な更新が発生してはいけない)。最も適切な実装方法はどれですか?
A2つのUpdateItem APIを順番に呼び出し、2つ目が失敗した場合はアプリケーション側でロールバック処理を実装する
アプリケーション側の手動ロールバックは、ロールバック中のシステム障害で整合性が崩れるリスクがあります。
BTransactWriteItems APIを使用し、2つのUpdateItemオペレーションを1つのトランザクションとしてまとめて実行する
✓ 正解
DynamoDBのTransactWriteItemsは最大100個のPut/Update/Delete/ConditionCheckオペレーションを1つのACIDトランザクションとして実行します。全オペレーションが成功するか全て失敗するかのどちらかとなり、部分的な更新は発生しません。
CDynamoDB Streamsで変更をキャプチャしてLambdaをトリガーし、補償トランザクションパターンを実装する
DynamoDB Streamsを使った補償トランザクションは、最終的整合性であり、厳密なアトミック性は保証されません。
DConditionExpressionを付けた2つのUpdateItemリクエストを並列実行し、どちらかが失敗した場合は再試行する
ConditionExpressionは条件付き書き込みに使いますが、並列実行では2つの操作のアトミック性を保証できません。
解説
DynamoDBのTransactWriteItemsは最大100個のPut/Update/Delete/ConditionCheckオペレーションを1つのACIDトランザクションとして実行します。全オペレーションが成功するか全て失敗するかのどちらかとなり、部分的な更新は発生しません。
選択肢Aのアプリケーション側の手動ロールバックは、ロールバック中のシステム障害で整合性が崩れるリスクがあります。
選択肢CのDynamoDB Streamsを使った補償トランザクションは、最終的整合性であり、厳密なアトミック性は保証されません。
選択肢DのConditionExpressionは条件付き書き込みに使いますが、並列実行では2つの操作のアトミック性を保証できません。
ドメイン別正答率・予想スコアでリアルタイムに実力把握
無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。
無料で演習を始める →