スキップしてコンテンツを表示

DynamoDB テーブルに楽観的ロックを実装する方法を教えてください。

所要時間1分
0

Amazon DynamoDB テーブルで DynamoDBMapper の代替として楽観的ロックを使用したいと考えています。

簡単な説明

DynamoDBMapper を使用せず、楽観的ロックを実装するには、AWS SDK で条件式と更新式を含むカスタムコードを作成します。このカスタムコードにより、テーブル内のバージョン番号が一致するかどうかを確認します。

解決策

次の手順を実行します。

  1. バージョン番号属性を含む DynamoDB テーブルを作成します。
    注: 更新対象の各項目にバージョン番号を関連付ける必要があります。

  2. 更新式SET 句を追加して項目を更新します。更新式がない場合は、作成します。
    更新式の構文例:

    UpdateExpression='SET #attr = :val',
    ExpressionAttributeNames={
        '#attr': 'attribute_to_update'
    },
    ExpressionAttributeValues={
        ':val': new_value
    },
    ConditionExpression='condition_expression'

    注: attribute_to_update を属性に、new_value を更新後の値に置き換えてください。

  3. 条件式を更新し、リクエストと 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" エラーが発生する原因を教えてください

AWS公式更新しました 2ヶ月前