DynamoDB TransactionConflictException
TL;DR: ya hay otra transacción operando en el mismo artículo que su solicitud, por lo que DynamoDB rechazó la suya para preservar el aislamiento. Es una contención transitoria, no un error en sus datos: vuelva a intentarlo con un retroceso exponencial, mantenga las transacciones pequeñas y reduzca las escrituras simultáneas en el mismo elemento importante.
Qué significa
TransactionConflictException: Transaction is ongoing for the itemDynamoDB serializa las escrituras en conflicto frente a las transacciones en curso. Alcanzas esta excepción cuando un PutItem, UpdateItem o DeleteItem simple colisiona con un TransactWriteItems en curso que incluye el mismo Item. En lugar de bloquear, DynamoDB rechaza la escritura de un solo Item con TransactionConflictException (HTTP 400). Sí es reintentable — el conflicto se despeja en cuanto la otra transacción se confirma o aborta.
Fíjate en la distinción con TransactionCanceledException: cuando la petición perdedora es en sí misma un TransactWriteItems o TransactGetItems, DynamoDB cancela toda esa transacción en su lugar — obtienes una cancelación cuyos CancellationReasons llevan TransactionConflict como código de razón por Item, no esta excepción.
Por qué ocurre
- Escrituras concurrentes al mismo Item — un
PutItem/UpdateItemsimple se solapa con unTransactWriteItemsen curso que toca ese Item. - Dos transacciones compartiendo un Item — dos peticiones
TransactWriteItemsincluyen la misma clave al mismo tiempo; una gana, la otra se cancela con un código de razónTransactionConflict(mostrado comoTransactionCanceledException). - Un Item caliente bajo fuertes actualizaciones concurrentes — p. ej. un contador compartido o una única fila de agregado que cada petición actualiza.
- Transacciones largas o grandes que retienen los Items lo suficiente como para solaparse con otros escritores.
- Una tormenta de reintentos — los reintentos sin backoff apilan más intentos concurrentes sobre el mismo Item en contención.
Cómo solucionarlo
- Reintenta con backoff exponencial + jitter. Esta es la solución principal — el conflicto es transitorio y se despeja cuando la otra transacción se asienta. Mantén el jitter para que los reintentos no se resincronicen en otra colisión.
- Mantén las transacciones pequeñas y cortas — menos Items por
TransactWriteItemssignifica retenciones más cortas y menos solapamiento. - Reduce la contención en los Items calientes — reparte un contador caliente entre varios Items y agrega, o usa un contador atómico con un
UpdateItemsimple (ADD) en lugar de una transacción cuando no necesites la semántica de todo o nada. - No mezcles una transacción y una escritura simple sobre el mismo Item de forma concurrente si puedes evitarlo — enruta ambas por el mismo camino.
- Monitoriza la métrica de CloudWatch
TransactionConflictpara ver si la contención está aumentando y dónde.
Inspecciónalo en DynoTable
Cuando el escritor concurrente eres tú, agrupa tus ediciones manuales en el área de preparación (⌘S) — DynoTable las confirma como una sola escritura revisada en lugar de un flujo de actualizaciones de un solo Item que se solapan. Abre los Items en contención con ⌘K e inspecciona su estado en vivo antes de reintentar.
Dimensiona el tráfico transaccional con la calculadora de precios. Cambia de perfil con ⌘P; Test Connection en Ajustes → Perfiles. Consulta Conectar con AWS e Instalación.
Fuentes
- Amazon DynamoDB Transactions: How it works (verificado el 2026-07-13)
- PutItem — Amazon DynamoDB API Reference (verificado el 2026-07-13)
FAQ
¿Cómo soluciono TransactionConflictException en DynamoDB? Reintenta la petición con backoff exponencial y jitter — el conflicto es contención transitoria con otra transacción en curso sobre el mismo Item. Además, mantén las transacciones pequeñas, reparte los Items calientes, y evita ejecutar una transacción y una escritura simple contra el mismo Item de forma concurrente.
¿Es TransactionConflictException lo mismo que TransactionCanceledException? No. TransactionConflictException significa que otra transacción está operando actualmente sobre el Item. TransactionCanceledException significa que toda una transacción se revirtió; sus CancellationReasons explican por qué, y un conflicto de transacción puede ser una de esas razones.
Errores relacionados
- TransactionCanceledException — toda una transacción revertida (condiciones, capacidad o un conflicto).
- ConditionalCheckFailedException — la condición de una sola escritura falló.
- Ejemplo de código: TransactWriteItems in Node.js — una transacción con reintento/backoff para adaptar.
- Aprende: DynamoDB transactions · Atomic counters
Referencias
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- PutItem — Amazon DynamoDB API Reference
- TransactWriteItems — Amazon DynamoDB API Reference
- DynamoDB metrics and dimensions — Amazon DynamoDB Developer Guide
Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.