AWS DynamoDBの擬似トランザクション処理

| コメントをどうぞ

先日の AWS Cloud Storage & DB Day 2014 の1コマに Lv1から始めるWebサービスのインフラ構築 の発表があり、後半部分が興味深かったので、内容をまとめてみる。

問題

2つのテーブル 所持金 と 薬草 を同時に更新したい。例えば、所持金から100を引き、薬草に1を足す。ただし薬草は99が上限となる。

失敗例

所持金-100を更新し、薬草+1を更新しようとして通信エラーとなって、所持金しか更新されなくなった。
順番を逆にしても、薬草+1しか更新されなくなる。

対応方法

(1) 更新依頼書テーブルを用意する。
(2) 更新依頼書レコードに「ユニークID、所持金:-100、薬草:+1」を登録し、ユニークIDをキューに登録する。
(3) キューのユニークIDから更新依頼書レコードを取得する。
(4) 所持金テーブルにユニークIDが無ければ、「所持金-100とユニークID追加」の更新を行う。
(5) 薬草テーブルにユニークIDが無ければ、「薬草+1とユニークID追加」の更新を行う。
(6) すべて成功したら、更新依頼書レコードのステータス完了に更新し、所持金テーブルと薬草テーブルのユニークID削除を更新し、キューから削除する。
(7) (4)が成功し(5)が通信エラーで失敗したら、(3)-(5)を再実行する
(8) (4)が成功し(5)が薬草>99となりエラーならば、以下のロールバックを行う。
(9) 所持金テーブルにユニークIDがあれば、「所持金+100とユニークID削除」の更新を行う。
(10) 薬草テーブルにユニークIDがあれば、「薬草-1とユニークID削除」の更新を行う。
(11) すべて成功したら、更新依頼書レコードのステータス中止に更新し、キューから削除する。

ポイントは、ユニークIDがフラグとなり、(4)-(5)は何度実行しても、1回しか更新されないため、リトライが可能。ロールバックは、ユニークIDが存在するレコードを元に戻していく。
更新依頼書のステータスは、「待機(2)」「実行中(3)-(5)(7)」「完了(6)」「復帰中(8)-(10)」「中止(11)」の状態がある。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>