為什麼我在 Amazon DynamoDB 中的 TransactWriteItems API 呼叫會失敗?

2 分的閱讀內容
0

我在 Amazon DynamoDB 中的 TransactWriteItems API 呼叫失敗。我想知道問題的根本原因。

解決方法

由於各種原因,TransactWriteItems API 請求可能會失敗或遭到 DynamoDB 拒絕。如需疑難排解步驟,請參閱下列解決方案。

條件表達式包含未滿足的條件

如果未滿足您在 TransactWriteItems 請求中的其中一項作業設定的條件,則所有作業都會失敗。**TransactWriteItems **請求是一種同步寫入作業,可將最多 25 個動作請求進行分組。所有動作請求都成功,或者所有動作請求都失敗。

如果您的請求因此問題而失敗,則您會收到類似下列的錯誤訊息:

"message": "Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed, None, None, None] (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: TransactionCanceledException;..."

若要解決此問題,請確定滿足您為請求設定的所有條件。

您正在使用的資料表位於不同的區域或帳戶

TransactWriteItems 請求允許您在不同的資料表中處理項目。但是,您只能使用在相同 AWS 區域和傳送請求的帳戶中的資料表。若要解決此問題,請僅使用與您提交 TransactWriteItems 請求之 AWS 帳戶相同的 AWS 區域中的資料表。

同一項目會由 TransactWriteItems 作業中的多個動作來處理

如果 TransactWriteItems 作業中有多個動作處理相同的項目,則請求會失敗,且您會收到類似下列的錯誤訊息:

「交易請求不能包含一個項目的多個作業」

例如,如果 TransactWriteItems 嘗試在同一個項目上同時執行 ConditionCheck 作業和 Put 作業,則請求會因 TransactionConflictException 而失敗。您可以使用 Amazon CloudWatch 中 DynamoDB 資料表的 TransactionConflict 指標來監控此例外狀況。

並行的 TransactWriteItems 請求之間的衝突

因為具有多個交易內項目的項目層級並行請求而產生交易衝突。發生交易衝突的可能原因如下:

  • 項目的 PutItemUpdateItem,或 DeleteItem 請求與包含相同項目、正在進行的 TransactWriteItems 請求衝突。
  • TransactWriteItems 請求中的項目是另一個正在進行的 TransactWriteItems 請求的一部分。

如果由於此原因拒絕了 PutItemUpdateItemDeleteItem 請求,則該請求會因 TransactionConflictException 而失敗。但是,如果因為不同的原因拒絕了 TransactWriteItemsTransactGetItems 中的項目層級請求,則該請求會因 TransactionCanceledException 而失敗。

沒有足夠的佈建容量來完成交易

如果在佈建容量不足時呼叫 TransactWriteItems 請求,則 DynamoDB 資料表會進行限流。如需限流的詳細資訊,請參閱為什麼我的隨需 DynamoDB 資料表會限流?以及為什麼我的 Amazon DynamoDB 佈建的資料表會受到限流?

由於 IdempotentParameterMismatch 而導致交易失敗

您可以在 TransactWriteItems 請求中包含選用的用戶端權杖,以確保請求是否具有冪等性。因連線逾時或其他連線問題而多次提交相同作業時,具有冪等性的交易可協助防止應用程式錯誤。

用戶端權杖在使用它的請求完成後有效時間為 10 分鐘。如果含有該權杖的請求在 10 分鐘時間內重複,但變更交易中的某些參數,則 DynamoDB 會傳回 IdempotentParameterMismatch例外情況。

發生 ValidationError

如果項目的大小大於 400 KB 或本機次要索引 (LSI) 變得太大,則會出現ValidationError。DynamoDB 限制您可以儲存在資料表中的每個項目的大小。如果您的應用程式必須在項目中儲存超過大小限制允許的資料,請壓縮一個或多個較大的屬性。或者,您也可將大項目細分為多個較小的項目,並按排序索引鍵進行索引。您也可以將項目儲存為 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的物件。這樣做後,您可以將 Amazon S3 物件識別碼儲存在 DynamoDB 項目中。如需詳細資訊,請參閱儲存大型項目和屬性的最佳實務

由於交易所做的變更,也可能會發生驗證錯誤。這表示請求中的參數不符合 DynamoDB 服務指定的一或多個限制。如需有關限制類型及其相關錯誤訊息的詳細資訊,請參閱 Class TransactionCanceledException。

交易中的項目大小彙總超過 4 MB

TransactWriteItems 作業不能超過 4 MB。這是一個硬性限制。如需詳細資訊,請參閱 DynamoDB 交易

發生 4xx 錯誤

使用者錯誤(例如無效的資料格式)可能出於多種原因。例如,您可能會針對 ResourceNotFoundException 錯誤收到 4xx 錯誤,這是因為 TransactWriteItems 作業找不到基礎 DynamoDB 資料表或索引。或者,DynamoDB 資料或索引可能沒有作用中狀態。

注意: 當您使用適用於 Java 的 AWS SDK 時,DynamoDB 會在 CancellationReasons 屬性上列出取消原因。此屬性未針對其他 SDK 語言進行設定。按請求項目順序列出交易取消原因。

發生 5xx 錯誤

交易也可能會因為系統錯誤記錄為 5xx 錯誤而失敗。當服務無法提供請求時,您會收到這些錯誤。這些錯誤可能出於各種原因,例如機群中的暫時性網路問題、基礎架構問題、儲存節點相關問題等。如需詳細資訊,請參閱 Amazon DynamoDB 中的內部伺服器錯誤疑難排解

相關資訊

常見錯誤

TransactWriteItems API

AWS 官方
AWS 官方已更新 8 個月前