我在 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 請求之間的衝突
因為具有多個交易內項目的項目層級並行請求而產生交易衝突。發生交易衝突的可能原因如下:
- 項目的 PutItem、UpdateItem,或 DeleteItem 請求與包含相同項目、正在進行的 TransactWriteItems 請求衝突。
- TransactWriteItems 請求中的項目是另一個正在進行的 TransactWriteItems 請求的一部分。
如果由於此原因拒絕了 PutItem、UpdateItem 或 DeleteItem 請求,則該請求會因 TransactionConflictException 而失敗。但是,如果因為不同的原因拒絕了 TransactWriteItems 或 TransactGetItems 中的項目層級請求,則該請求會因 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