场景:我们有一个支持带版本号的乐观锁定的Dynamo数据库表。两个并发线程正在尝试使用与该表相同的主键值保存两个不同的条目。
问题:对于后一个保存操作,是否会抛出ConditionalCheckFailedException?
答案 0 :(得分:1)
是的,尝试插入相同数据的第二个线程将抛出ConditionalCheckFailedException
。
com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException
只要项目保存在数据库中,后续更新的版本应与DynamoDB表上的值匹配(即服务器端值)。
save - 对于新项目,DynamoDBMapper会分配初始版本 编号1.如果检索项目,请更新其中一个或多个项目 属性并尝试保存更改,保存操作 只有在客户端和版本号上才能成功 服务器端匹配。 DynamoDBMapper增加版本号 自动。
答案 1 :(得分:1)
我们过去有类似的用例,但在我们的例子中,多个线程首先从dynamoDB读取然后尝试更新值。
所以最终版本会在他们阅读时发生变化并且他们尝试更新文档,如果您没有从DynamoDB读取最新值,那么中间更新将会丢失(这称为更新丢失问题请参阅aws-docs以获取更多信息。)
我不确定,如果你有这个用例,但如果你只有2个线程试图更新该值,然后如果其中一个获得不同的版本,而他们的请求到达DynamoDB,那么你将获得{{ 1}}例外。