Perché una chiamata all'API TransactWriteItems non ha esito positivo in Amazon DynamoDB?
La mia chiamata all'API TransactWriteItems non ha esito positivo in Amazon DynamoDB. Voglio capire la causa principale del problema.
Risoluzione
La richiesta API ](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html)TransactWriteItems[ può avere esito negativo o essere rifiutata da DynamoDB per diversi motivi. Consulta le soluzioni seguenti con i passaggi per risolvere il problema.
L'espressione di condizione contiene una condizione non soddisfatta
Se una condizione impostata per una delle operazioni nella richiesta TransactWriteItems non è soddisfatta, tutte le operazioni avranno esito negativo. La richiesta TransactWriteItems è un'operazione di scrittura sincrona che raggruppa fino a 25 richieste di azione. Le richieste di azione possono avere tutte esito positivo o tutte esito negativo.
Se la richiesta non va a buon fine a causa di questo problema, verrà visualizzato un messaggio di errore simile al seguente:
"message": "Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed, None, None, None] (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: TransactionCanceledException;..."
Per risolvere il problema, verifica che tutte le condizioni impostate per la richiesta siano soddisfatte.
La tabella su cui operi si trova in un'altra regione o in un altro account
Le richieste TransactWriteItems permettono di operare su elementi in tabelle diverse. Tuttavia, puoi operare solo con tabelle che si trovano nella stessa regione AWS e nello stesso account che ha inviato la richiesta. Per risolvere il problema, utilizza solo tabelle che si trovano nella stessa regione AWS dell'account AWS da cui effettui la richiesta TransactWriteItems.
Lo stesso elemento viene gestito da più azioni nell'operazione TransactWriteItems
Se nell'operazione TransactWriteItems c'è più di un'azione che gestisce lo stesso elemento, la richiesta avrà esito negativo e verrà visualizzato un messaggio di errore simile al seguente:
"Transaction request cannot include multiple operations on one item" (La richiesta di transazione non può includere più operazioni su uno stesso elemento)
Ad esempio, se TransactWriteItems tenta di eseguire sia un'operazione ConditionCheck che un'operazione Put sullo stesso elemento, la richiesta genererà l'eccezione TransactionConflictException. Puoi monitorare questa eccezione con la metrica TransactionConflict per la tua tabella DynamoDB in Amazon CloudWatch.
Conflitto tra richieste TransactWriteItems simultanee
Un conflitto transazionale è causato da richieste simultanee a livello di elemento per un elemento all'interno di più transazioni. I conflitti transazionali possono verificarsi per i motivi seguenti:
- Una richiesta PutItem, UpdateItem o DeleteItem per un elemento è in conflitto con una richiesta TransactWriteItems in corso che include lo stesso elemento.
- Un elemento all'interno di una richiesta TransactWriteItems fa parte di un'altra richiesta TransactWriteItems in corso.
Se una richiesta PutItem, UpdateItem o DeleteItem viene rifiutata per questo motivo, la richiesta genererà l'eccezione TransactionConflictException. Tuttavia, se una richiesta a livello di elemento all'interno di TransactWriteItems o TransactGetItems viene rifiutata per un motivo diverso, la richiesta genererà l'eccezione TransactionCanceledException.
La capacità allocata non è sufficiente per completare la transazione
Se invochi la richiesta TransactWriteItems quando non c'è sufficiente capacità allocata, la tabella DynamoDB verrà limitata. Per ulteriori informazioni sulla limitazione, vedi Perché la mia tabella DynamoDB on demand subisce limitazioni? e Perché la tabella Amazon DynamoDB allocata è limitata?
Le transazioni hanno esito negativo a causa dell'eccezione IdempotentParameterMismatch
Puoi includere un token client opzionale nella richiesta TransactWriteItems per assicurarti che le richieste siano idempotenti. Le transazioni idempotenti possono contribuire a prevenire errori nelle applicazioni quando la stessa operazione viene inviata più volte a causa di un timeout della connessione o di altri problemi di connettività.
Un token client è valido per 10 minuti dopo il termine della richiesta che lo utilizza. Se la richiesta con quel token si ripete entro la finestra di 10 minuti ma modifica alcuni parametri all'interno della transazione, DynamoDB restituisce un'eccezione IdempotentParameterMismatch.
Si è verificato un errore di tipo ValidationError
Se la dimensione di un elemento supera i 400 KB o un indice secondario locale diventa troppo grande, verrà visualizzato un errore ValidationError. DynamoDB limita le dimensioni di ogni elemento che puoi archiviare in una tabella. Se l'applicazione deve archiviare in un elemento più dati di quelli consentiti dal limite di dimensione, comprimi uno o più degli attributi più grandi. In alternativa, suddividi l'elemento grande in elementi più piccoli, indicizzati per chiavi di ordinamento. Puoi anche archiviare l'elemento come oggetto in un bucket Amazon Simple Storage Service (Amazon S3) e archiviare quindi l'identificatore dell'oggetto Amazon S3 nell'elemento DynamoDB. Per ulteriori informazioni, consulta Best practices for storing large items and attributes.
Possono verificarsi errori di convalida anche a causa di modifiche apportate dalla transazione. Ciò significa che i parametri della richiesta non soddisfano uno o più vincoli specificati dal servizio DynamoDB. Per ulteriori informazioni sui tipi di vincoli e sui messaggi di errore associati, vedi la documentazione per la classe TransactionCanceledException.
La dimensione aggregata degli elementi di una transazione supera i 4 MB
L'operazione TransactWriteItems non può superare i 4 MB. Questo limite è fisso. Per ulteriori informazioni, consulta Transazioni di DynamoDB.
Si è verificato un errore 4xx
Un errore utente, ad esempio un formato di dati non valido, può verificarsi per diversi motivi. Ad esempio, potrebbe essere visualizzato un errore 4xx per un'eccezione ResourceNotFoundException perché l'operazione TransactWriteItems non trova la tabella o l'indice DynamoDB sottostante. Oppure la tabella o l'indice DynamoDB potrebbero non essere nello stato ACTIVE.
Nota: quando utilizzi AWS SDK per Java, DynamoDB elenca i motivi dell'annullamento nella proprietà CancellationReasons. Questa proprietà non è impostata per altri linguaggi SDK. I motivi dell'annullamento delle transazioni sono elencati nell'ordine in cui gli elementi sono stati richiesti.
Si è verificato un errore 5xx
Le transazioni possono avere esito negativo anche a causa di errori di sistema registrati come errori 5xx. Questi errori si verificano quando il servizio non è in grado di soddisfare la richiesta. Questi errori possono verificarsi per vari motivi, come problemi transitori di rete nel parco, problemi infrastrutturali, problemi relativi ai nodi di archiviazione e altro ancora. Per ulteriori informazioni, consulta Troubleshooting internal server errors in Amazon DynamoDB.
Informazioni correlate
- Argomenti
- Database
- Lingua
- Italiano
