場景:我們有一個Dynamo DB表,支持使用版本號進行樂觀鎖定。兩個併發線程試圖將具有相同主鍵值的兩個不同條目保存到該表中。Dynamo DB在保存操作期間的樂觀鎖定行爲
問題:後期保存操作是否會引發ConditionalCheckFailedException?
場景:我們有一個Dynamo DB表,支持使用版本號進行樂觀鎖定。兩個併發線程試圖將具有相同主鍵值的兩個不同條目保存到該表中。Dynamo DB在保存操作期間的樂觀鎖定行爲
問題:後期保存操作是否會引發ConditionalCheckFailedException?
是的,試圖插入相同數據的第二個線程會拋出ConditionalCheckFailedException
。
com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException
一旦項目被保存在數據庫中,在後續的更新應該有對DynamoDB表(即服務器端值)值的版本匹配。
保存 - 對於一個新項目時,DynamoDBMapper分配初始版本 號1.如果您檢索項目,更新其 屬性中的一個或多個並試圖保存更改,保存操作 纔會成功如果客戶端的版本號和服務器端的版本號匹配。 DynamoDBMapper自動增加版本號 。
我們在過去有一個類似的用例,但在我們的例子中,多個線程先從dynamoDB中讀取,然後嘗試更新值。
因此,最終版本會隨着他們閱讀時間發生變化,他們嘗試更新文檔,並且如果您沒有從DynamoDB讀取最新值,則中間更新將丟失(這稱爲更新丟失有關更多信息,請參閱aws-docs)。
我不確定,如果你有這個用例,但是如果你只有2個線程試圖更新值,然後如果他們中的一個獲得不同的版本,而他們的請求到達DynamoDB,那麼你將得到ConditionalCheckFailedException
例外。關於此錯誤的
發現請依照您的問題,並要求後續查詢。讓我知道我的答案是否解決了您的問題? –