Загадочный TransactionConflict в TransactionCanceledException - PullRequest
0 голосов
/ 18 января 2019

Используя transactWriteItems в aws-sdk (js), мы получаем TransactionCanceledException .Причина этого исключения указывается как TransactionConflict .Иногда все действия в транзакции терпят неудачу, иногда только несколько или только одно.Мы выполняем несколько транзакций параллельно, которые могут работать с одними и теми же элементамиВ документации не упоминается эта конкретная ошибка.Возможная причина:

  1. Условие в одном из выражений условия не выполнено.
  2. Таблица в запросе TransactWriteItems находится в другой учетной записи или регионе.
  3. Несколько операций в операции TransactWriteItems предназначены для одного и того же элемента.
  4. Недостаточно выделенной емкости для завершения транзакции.
  5. Размер элемента становится слишком большим (больше чем400 КБ), либо локальный вторичный индекс (LSI) становится слишком большим, либо возникает аналогичная ошибка проверки из-за изменений, внесенных транзакцией.
  6. Произошла ошибка пользователя, например, неверный формат данных.

Ничего из этого не применимо, и при повторной попытке транзакции, похоже, в конечном итоге сработает.Кто-нибудь знает об этом исключении?Я не могу найти ничего задокументированного.

1 Ответ

0 голосов
/ 18 января 2019

То, что вы испытываете, не является ошибкой - это на самом деле часть функции, и это было упомянуто в объявлении о запуске .

Товары не блокируются во время транзакции. Транзакции DynamoDB обеспечивают сериализуемую изоляцию. Если элемент изменяется вне транзакции во время выполнения транзакции, транзакция отменяется, и выдается исключение с подробностями о том, какой элемент или элементы вызвали исключение.

Вместо этого, вместо блокировки, DynamoDB использует то, что называется оптимистическим управлением параллелизмом (которое также (смешанно) называется оптимистической блокировкой). Если вы хотите узнать больше об этом, статья в Википедии о Оптимистическом управлении параллелизмом довольно хороша.

Возвращаясь к данному вопросу, документация AWS для транзакций гласит:

Несколько транзакций, одновременно обновляющих одни и те же элементы, могут вызвать конфликты, отменяющие транзакции. Мы рекомендуем следовать рекомендациям DynamoDB для моделирования данных, чтобы минимизировать такие конфликты.

Специально для TransactWriteItems они говорят:

Транзакции записи не выполняются при следующих обстоятельствах:

Когда текущая операция TransactWriteItems конфликтует с параллельным запросом TransactWriteItems для одного или нескольких элементов в операции TransactWriteItems. В этом случае одновременный запрос завершается с TransactionCancelledException

Аналогично для TransactGetItems:

Транзакции чтения не выполняются при следующих обстоятельствах:

Когда происходит текущая операция TransactGetItems, которая конфликтует с одновременным запросом PutItem, UpdateItem, DeleteItem или TransactWriteItems. В этом случае операция TransactGetItems завершается с ошибкой TransactionCancelledException

...