DynamoDBMapper乐观锁定-我必须先调用负载吗?

时间:2020-07-22 17:36:47

标签: java amazon-dynamodb

我正在尝试对正在创建的应用程序使用乐观锁定。在AWS网站上,它提到“通过乐观锁定,每个项目都有一个充当版本号的属性。如果您从表中检索一个项目,则应用程序会记录该项目的版本号。您可以更新项,但前提是服务器端的版本号没有更改;如果版本不匹配,则表示其他人在此之前已对该项进行了修改。更新尝试失败,因为您有该项的过时版本。” 如果我在不先调用加载的情况下更新对象,那么如果发生版本不匹配,乐观锁定是否仍然有效?换句话说,为使乐观锁定正常工作,呼叫负载是否必不可少?

1 个答案:

答案 0 :(得分:1)

换句话说,为了使乐观锁定能够正常工作,呼叫负载是必需的吗?

不是,但是通常,如果您在尝试更新项目之前未加载项目,则使用乐观锁定将很困难。

原因是由于其工作原理:当您发送 条件更新请求 进行乐观锁定时,条件通常位于物品上 version 属性的,即在同一更新请求中也被更新了(通常加1)。

因此,为了使更新生效,需要告诉DynamoDB该version属性的值必须是什么。

如果您在尝试发送用于乐观锁定的条件更新请求之前未加载项目,您怎么知道当前版本是什么?如果您不知道该版本是什么,那么通常就不能期望条件更新请求能够正常工作。


也就是说,在某些情况下,对于某些请求不要使用乐观锁定。

例如,假设您需要更改给定属性的值,并且项目状态中的任何内容都不会更改您的需求。在这种情况下,您不需要乐观地锁定进行此更新:您只需告诉DynamoDB执行更新即可(同时还增加了version属性!)。如果其他 other 并发操作也不使用乐观锁定(即不使用有条件更新)而成功,则失败如果他们正在使用它。