我想对我的 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 示例
Why do I get a "ConditionalCheckFailedException" error in DynamoDB?(为什么我在 DynamoDB 中收到“ConditionalCheckFailedException”错误?)