Это относится к функции транзакции DynamoDB. У меня есть следующий сценарий:
Случай 1:
Допустим, есть 3 атрибута элемента из 3 разных таблиц в DynamoDB - для простоты мы называем их 'a ',' b 'и' c '.
Теперь у меня есть обработчик API для атомарного преобразования 'a', 'b и' c 'вместе. Этот обработчик спроектирован таким образом, что он может получить запрос POST для «a» или «b» и вычислить «c», а затем передать значения в БД. Таким образом, когда «a» приходит через POST-запрос, процесс-обработчик прочитает «b» из БД, затем вычислит «c» на основе входящего «a» и существующего «b» и, наконец, передаст «a» и «с 'к БД атомным способом. Но, если 'b' видоизменяется каким-либо другим потоком до того, как 'a' и 'c' будут зафиксированы в БД, процесс завершится неудачно (или повторяется с новым значением 'b').
Ниже приведен ожидаемый сценарий:
Предполагается c = (a + b)
t = 0 :
- В БД: a = 5, b = 10, c = 15
t = 1 :
POST-запрос: a = 7
Запуск транзакции с БД:
a = 7 (из POST)
читать 'b' из БД как b = 10
вычислять 'c' как c = 17
инициировать фиксацию'a' и 'c' в t = 5
фиксация не удалась, потому что 'b' стало 20 при t = 3 (некоторыедругой поток мутировал его)
при наличии логики повторения процесс снова начнется с чтения «b» из БД как b = 20 с последующими другими оставшимися шагами.
Мой вопрос: Можно ли достичь вышеуказанного результата с помощью транзакций DynamoDB? Может ли DynamoDB выдавать ошибку во время фиксации (из 'a' и 'c'), если какой-то другой поток мутировал 'b' после того, как он был прочитан этим потоком-обработчиком? Кажется, что здесь не поможет функция проверки условий в транзакции.
Случай 2:
Та же ситуация, что и выше, но все три являются частьюта же таблица. Значения «a», «b» и «c» - это три разных атрибута одного и того же элемента. Что будет в этом случае?