Por que minha chamada da API TransactWriteItems está falhando no Amazon DynamoDB?

Data da última atualização: 07/09/2022

Minha chamada da API TransactWriteItems está falhando e eu quero descobrir a causa raiz do problema.

Resolução

Uma solicitação TransactWriteItems pode falhar ou ser rejeitada pelo Amazon DynamoDB por vários motivos.

Uma condição não foi atendida em uma das expressões de condição

Todas as operações falharão se uma condição que você definiu para uma das operações em sua solicitação TransactWriteItems não for atendida. TransactWriteItems é uma operação de gravação síncrona que agrupa até 25 solicitações de ação. Portanto, ou todas as solicitações de ação são bem-sucedidas ou todas as solicitações de ação falham.

Se estiver enfrentando esse problema, você receberá uma mensagem de erro semelhante a esta:

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

Para solucionar esse problema, certifique-se de que todas as condições definidas para sua solicitação sejam atendidas.

A tabela na solicitação TransactWriteItems está em uma região ou conta diferente

As solicitações TransactWriteItems permitem que você trabalhe com itens em diferentes tabelas. Mas você não pode trabalhar com tabelas que estejam em regiões ou contas diferentes. Certifique-se de que você esteja trabalhando com tabelas que estejam na mesma região da conta que você está usando para fazer a solicitação TransactWriteItems.

O mesmo item é processado por mais de uma ação na operação TransactWriteItems

Quando mais de uma ação na operação TransactWriteItems processa o mesmo item, a solicitação falha com uma mensagem semelhante a esta:

“Transaction request cannot include multiple operations on one item” (A solicitação de transação não pode incluir várias operações em um item)

Sendo assim, p. ex., se TransactWriteItems tentar executar uma operação ConditionCheck e Put no mesmo item, a solicitação falhará. Você pode monitorar essa exceção de TransactionConflict usando a métrica TransactionConflict para sua tabela do DynamoDB no Amazon CloudWatch.

Não há capacidade provisionada suficiente para concluir a transação

Como qualquer outra operação, uma tabela do DynamoDB pode passar por controle de utilização quando você chama a operação TransactWriteItems. Para obter mais informações sobre como resolver esse problema, consulte Why is my on-demand Amazon DynamoDB table being throttled? (Por que minha tabela sob demanda do Amazon DynamoDB está passando por controle de utilização?) e Why is my Amazon DynamoDB table being throttled? (Por que minha tabela do Amazon DynamoDB está passando por controle de utilização?).

Ocorreu um ValidationError

Um ocorrerá ValidationError se um item ficar maior que 400 KB ou um Local secondary index (LSI – Índice secundário local) ficar muito grande. Da mesma forma, erros de validação podem ocorrer devido às alterações feitas pela transação. Isso significa que a entrada falha em satisfazer uma ou mais restrições especificadas pelo serviço do DynamoDB. O erro de validação é acompanhado por uma destas mensagens, dependendo de qual restrição não for satisfeita:

  • Um ou mais valores de parâmetros são inválidos.
  • A expressão de atualização tenta atualizar a chave de índice secundária além dos limites de tamanho permitidos.
  • A expressão de atualização tenta atualizar a chave de índice secundária para um tipo incompatível.
  • Um operando na expressão de atualização tem um tipo de dados incorreto.
  • O item a ser atualizado excedeu o tamanho máximo permitido.
  • Você está tentando armazenar um número com magnitude superior ao intervalo compatível ou há estouro de número.
  • Há uma incompatibilidade de tipo para o atributo a ser atualizado.
  • Os níveis de aninhamento excederam os limites compatíveis.
  • O caminho do documento fornecido na expressão de atualização é inválido para atualização.
  • A expressão fornecida se refere a um atributo que não existe no item.

O DynamoDB limita o tamanho de cada item que você pode armazenar em uma tabela. Se o aplicativo precisar armazenar mais dados em um item do que o limite de tamanho permite, compacte um ou mais dos atributos maiores. Como alternativa, divida o item em vários itens, indexados por chaves de classificação. Você também pode armazenar o item como um objeto no Amazon Simple Storage Service (Amazon S3). Em seguida, armazene o identificador de objeto do Amazon S3 em seu item do DynamoDB. Para obter mais informações, consulte Práticas recomendadas para armazenar itens e atributos grandes.

O tamanho agregado dos itens em uma transação excede 4 MB

As operações de TransactWriteItems não podem exceder 4 MB. Esse é um limite rigoroso. Para obter mais informações, consulte DynamoDB transactions (Transações do DynamoDB).

Ocorreu um erro do usuário

Um erro do usuário, como um formato de dados inválido, pode ocorrer por vários motivos. Por exemplo, você pode receber um erro 4xx para ResourceNotFoundException porque a operação TransactWriteItems não consegue localizar a tabela ou o índice subjacente do DynamoDB. Outra possibilidade é que a tabela ou índice do DynamoDB não esteja ACTIVE (Ativo).

Observação: quando você usa o AWS SDK para Java, o DynamoDB lista os motivos do cancelamento na propriedade CancellationReasons. Essa propriedade não está definida para outros idiomas. Os motivos de cancelamento da transação são listados na ordem dos itens solicitados. Se um item não apresentar erro, ele listará um código NONE (Nenhum) e uma mensagem null (nulo). Para obter mais informações, consulte TransactWriteItems.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?