1

場景:我們有一個Dynamo DB表,支持使用版本號進行樂觀鎖定。兩個併發線程試圖將具有相同主鍵值的兩個不同條目保存到該表中。Dynamo DB在保存操作期間的樂觀鎖定行爲

問題:後期保存操作是否會引發ConditionalCheckFailedException?

+0

發現請依照您的問題,並要求後續查詢。讓我知道我的答案是否解決了您的問題? –

回答

1

是的,試圖插入相同數據的第二個線程會拋出ConditionalCheckFailedException

com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException 

一旦項目被保存在數據庫中,在後續的更新應該有對DynamoDB表(即服務器端值)值的版本匹配。

保存 - 對於一個新項目時,DynamoDBMapper分配初始版本 號1.如果您檢索項目,更新其 屬性中的一個或多個並試圖保存更改,保存操作 纔會成功如果客戶端的版本號和服務器端的版本號匹配。 DynamoDBMapper自動增加版本號 。

1

我們在過去有一個類似的用例,但在我們的例子中,多個線程先從dynamoDB中讀取,然後嘗試更新值。

因此,最終版本會隨着他們閱讀時間發生變化,他們嘗試更新文檔,並且如果您沒有從DynamoDB讀取最新值,則中間更新將丟失(這稱爲更新丟失有關更多信息,請參閱aws-docs)。

我不確定,如果你有這個用例,但是如果你只有2個線程試圖更新值,然後如果他們中的一個獲得不同的版本,而他們的請求到達DynamoDB,那麼你將得到ConditionalCheckFailedException例外。關於此錯誤的

更多信息可以在這裏http://grepcode.com/file/repo1.maven.org/maven2/com.michelboudreau/alternator/0.10.0/com/amazonaws/services/dynamodb/model/ConditionalCheckFailedException.java