Dynamodb не хватает обновлений с одновременными запросами? - PullRequest
1 голос
/ 11 июля 2020

У меня проблемы с обновлением одного элемента сразу несколько раз. Если я пытаюсь обновить элемент новыми атрибутами много раз, например:

UpdateExpression: 'SET attribute.#uniqueId = :newAttribute'

не все обновления go через. Я попытался отправить 20 обновлений с уникальными идентификаторами, и в результате появилось только 15 новых атрибутов. Это также происходит в моем локальном экземпляре Dynamodb. Я предполагаю, что обновления каким-то образом перезаписывают друг друга в сценарии «последнее обновление выигрывает», но я не уверен. Как я могу это решить?

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Ваше наблюдение очень интересно и противоречит наблюдениям, сделанным в прошлом в Являются ли DynamoDB "установленными" значениями CDRT? и Параллельные обновления в DynamoDB, есть ли какие-либо гарантии? - в Эти проблемы люди заметили, что одновременные записи в разные элементы набора или в разные атрибуты верхнего уровня, похоже, не перезаписываются. Однако ни один из случаев не совпадает с тем, что вы тестировали (вложенные атрибуты), поэтому это не окончательное доказательство того, что с вашим тестом что-то не так, но все же удивительно.

Презентации, сделанные в прошлом DynamoDB разработчики предположили, что в DynamoDB запись происходит на одном узле (назначенном «лидере» раздела), и что этот узел может сериализовать параллельные записи. Эта сериализация необходима для обеспечения безопасной работы условных обновлений, приращений счетчиков и т. Д. c. С одновременной записью. Предположительно, одна и та же сериализация могла бы также позволить одновременно безопасно изменять несколько субатрибутов. В противном случае это может означать, что эта сериализация намеренно отключена для определенных обновлений, возможно, для всех безусловных обновлений (без ConditionExpression). Это очень удивительно, и Amazon должна была документально подтвердить это ...

1 голос
/ 12 июля 2020

DynamoDB в конечном итоге становится согласованным при обновлении, поэтому возможны «условия гонки». Если вам нужны более строгие логические c записи, обратите внимание на транзакции

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

...