我想在 Amazon DynamoDB 資料表中使用樂觀鎖定,而不是使用 DynamoDBMapper。
簡短說明
若要在沒有 DynamoDBMapper 的情況下實作樂觀鎖定,請在您的 AWS SDK 中使用條件與更新表達式撰寫自訂程式碼。自訂程式碼會檢查您資料表中的版本號碼是否相符。
解決方法
請完成下列步驟:
-
建立一個 DynamoDB 資料表,並包含版本號碼屬性。
**注意:**您必須為每個要更新的項目關聯一個版本號碼。
-
在您的更新表達式中加入 SET 子句以更新項目。如果您沒有更新表達式,請先建立一個。
更新表達式語法範例:
UpdateExpression='SET #attr = :val',
ExpressionAttributeNames={
'#attr': 'attribute_to_update'
},
ExpressionAttributeValues={
':val': new_value
},
ConditionExpression='condition_expression'
**注意:**將 attribute_to_update 替換為您的屬性,將 new_value 替換為您想更新的新值。
-
更新條件表達式,以比對請求的版本號碼與 DynamoDB 資料表中的值。如果您沒有條件表達式,請先建立一個。
條件表達式語法範例:
ExpressionAttributeNames = {
"#attr": "attribute_name"
}
ExpressionAttributeValues = {
":val": "new_value"
}
**注意:**將 attribute_name 替換為您的表達式屬性名稱,將 new_value 替換為您想更新的新值。
如果版本號碼相符,更新會成功。如果版本號碼不相符,您將收到「ConditionalCheckFailedExpection」錯誤,且無法覆寫其他用戶端所做的變更。
若要管理「ConditionalCheckFailedExpection」錯誤,請在 AWS SDK 中使用以下錯誤處理邏輯:
print("Update successful")
except ClientError as e:
if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
print("Item was modified by another process. Please retry.")
else: raise e
若要測試您的自訂表達式,請在請求中包含錯誤的版本號碼。
相關資訊
放置項目 (Java)
放置項目 (.NET)
DynamoDB 條件表達式 CLI 範例
為何我在 DynamoDB 中會收到「ConditionalCheckFailedException」錯誤?