跳至內容

如何在 DynamoDB 資料表上實作樂觀鎖定?

1 分的閱讀內容
0

我想在 Amazon DynamoDB 資料表中使用樂觀鎖定,而不是使用 DynamoDBMapper。

簡短說明

若要在沒有 DynamoDBMapper 的情況下實作樂觀鎖定,請在您的 AWS SDK 中使用條件與更新表達式撰寫自訂程式碼。自訂程式碼會檢查您資料表中的版本號碼是否相符。

解決方法

請完成下列步驟:

  1. 建立一個 DynamoDB 資料表,並包含版本號碼屬性。
    **注意:**您必須為每個要更新的項目關聯一個版本號碼。

  2. 在您的更新表達式中加入 SET 子句以更新項目。如果您沒有更新表達式,請先建立一個。
    更新表達式語法範例:

    UpdateExpression='SET #attr = :val',
    ExpressionAttributeNames={
        '#attr': 'attribute_to_update'
    },
    ExpressionAttributeValues={
        ':val': new_value
    },
    ConditionExpression='condition_expression'

    **注意:**將 attribute_to_update 替換為您的屬性,將 new_value 替換為您想更新的新值。

  3. 更新條件表達式,以比對請求的版本號碼與 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」錯誤?

AWS 官方已更新 2 個月前