Amazon DynamoDB テーブルで DynamoDBMapper の代替として楽観的ロックを使用したいと考えています。
簡単な説明
DynamoDBMapper を使用せず、楽観的ロックを実装するには、AWS SDK で条件式と更新式を含むカスタムコードを作成します。このカスタムコードにより、テーブル内のバージョン番号が一致するかどうかを確認します。
解決策
次の手順を実行します。
-
バージョン番号属性を含む DynamoDB テーブルを作成します。
注: 更新対象の各項目にバージョン番号を関連付ける必要があります。
-
更新式に SET 句を追加して項目を更新します。更新式がない場合は、作成します。
更新式の構文例:
UpdateExpression='SET #attr = :val',
ExpressionAttributeNames={
'#attr': 'attribute_to_update'
},
ExpressionAttributeValues={
':val': new_value
},
ConditionExpression='condition_expression'
注: attribute_to_update を属性に、new_value を更新後の値に置き換えてください。
-
条件式を更新し、リクエストと DynamoDB テーブル内の値の間のバージョン番号をテストします。条件式がない場合は、作成します。
条件式の構文例:
ExpressionAttributeNames = {
"#attr": "attribute_name"
}
ExpressionAttributeValues = {
":val": "new_value"
}
注: attribute_name を式の属性名に、new_value を更新後の値に置き換えてください。
バージョン番号が一致する場合、更新は正常に行われています。バージョン番号が一致しない場合、"ConditionalCheckFailedExpection" エラーが発生し、他のクライアントが行った変更は上書きされません。
"ConditionalCheckFailedExpection" エラーに対処するには、AWS SDK で次のエラー処理ロジックを使用します。
print("Update successful")
except ClientError as e:
if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
print("Item was modified by another process. Please retry.")
else: raise e
カスタム式をテストするために、リクエストで不適切なバージョン番号を指定します。
関連情報
項目の配置 (Java)
項目の配置 (.NET)
DynamoDB の条件式例 (CLI)
DynamoDB で "ConditionalCheckFailedException" エラーが発生する原因を教えてください