abe*_*eer 6 java amazon-web-services amazon-dynamodb
我试图了解DynamoDB乐观锁定是否适合我的用例,还是应该做其他事情。
我正在尝试在Java方法中执行以下操作。
function updateItem(String key) {
Item item = mapper.load(Item.class, key);
if (some condition) {
item.setValue(item.getValue() + 1);
mapper.save(item);
}
}
Run Code Online (Sandbox Code Playgroud)
我想根据某些条件成功更新同一项目。我创建了一个version属性,以便乐观锁定起作用,当我有多个请求进入时,只有一个请求会获取并更新数据。
我试图了解以下内容:
当其他线程尝试更新值但版本ID更改时会发生什么,我找不到任何有关引发异常的文档?
我应该为此使用同步功能吗?考虑到会有多个请求?但是,在我看来,这似乎无法实现乐观锁定的目的,因为我不在乎哪个请求首先获得访问权限。
是否有解决此问题的替代方法?
我阅读过以下文档:http : //docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html
如果您需要保证应用所有多个请求(来自不同线程/服务器),您可以使用以下乐观锁定实现:
\n\npublic void updateItem(String key) {\n while (true) {\n try {\n Item item = dynamoDBMapper.load(Item.class, key);\n if (some condition) {\n item.setValue(item.getValue() + 1);\n dynamoDBMapper.save(item);\n }\n break;\n } catch (ConditionalCheckFailedException e) {\n System.out.println("ConditionalCheckFailedException. Retrying again...");\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在这里,如果项目已被另一个请求更新,我们将收到 ConditionalCheckFailedException 并再次尝试,直到应用更改。
\n\nConditionalCheckFailedException - 当预期值与系统(数据库)中找到的值不匹配时抛出此异常。将抛出此异常:
\n\n关于@Nawaz问题,如果您没有\xe2\x80\x99t指定自己的条件约束(使用DynamoDBSaveExpression和DynamoDBDeleteExpression),则此异常是由于版本更改所致。如果捕获 ConditionalCheckFailedException,您将获得以下信息:
\n\nrequestId = \xe2\x80\xa6\nerrorCode = ConditionalCheckFailedException\nerrorType = {AmazonServiceException$ErrorType} "Client"\nerrorMessage = The conditional request failed\nstatusCode = 400\nserviceName = AmazonDynamoDBv2\nRun Code Online (Sandbox Code Playgroud)\n
- 当其他线程尝试更新该值但版本 id 已更改时会发生什么,我找不到有关将抛出什么异常的任何文档?
如果版本 ID 已更改,它似乎会抛出 ConditionalCheckFailedException。
- 我应该为此使用同步函数吗?考虑到多个请求会进来?但是,对我来说,这似乎违背了乐观锁定的目的,因为我不在乎哪个请求首先获得访问权限。
你是对的,使用同步函数会破坏乐观锁定的目的。你不需要两者。乐观锁定适用于分布式环境,其中更新可能不会由相同的服务器生成。
- 这个问题有替代解决方案吗?
您可以使用低级 DynamoDB API 和条件更新。我认为这就是乐观锁定在下面使用的内容。如果您使用的是 Java 或 .Net 以外的语言,则必须使用低级 API。由于您正在使用 Java 并且已经在使用高级 API,因此我会坚持下去。
| 归档时间: |
|
| 查看次数: |
9955 次 |
| 最近记录: |