跳至内容

如何在 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 示例

Why do I get a "ConditionalCheckFailedException" error in DynamoDB?(为什么我在 DynamoDB 中收到“ConditionalCheckFailedException”错误?)

AWS 官方已更新 2 个月前