Я пытаюсь выполнить некоторые операции с таблицей DynamoDB за одну транзакцию, выполнив официальный документ Операции с транзакциями .
Я пытаюсь сделать следующее:
Для конкретной записи (идентифицируемой ее первичным ключом) обновляйте ее, только если ее конкретный атрибут удовлетворяет некоторому условию.
Я делаю это с DynamoDBMapper.
TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest();
transactionWriteRequest.addUpdate(obj);
transactionWriteRequest.addConditionCheck(obj, new DynamoDBTransactionWriteExpression().withConditionExpression("attribute_exists(attr1)"));
Этот код выполняет следующие действия: обновляет obj
в БД значениями атрибута obj
, только если в соответствующей строке в БД - строка. attr1
== obj.attr1
.
Однако, я продолжаю получать эту ошибку
! com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException:
Transaction request cannot include multiple operations on one item
(Service: AmazonDynamoDBv2;
Status Code: 400;
Error Code: ValidationException;
Request ID: UPBT23M5C6HK2S9DO51OAGK1CNVV4KQNSO5AEMVJF66Q9ASUAAJG)
Я считаю, что причина в том, что addUpdate()
и addConditionCheck()
считаются двумя операциями над одной строкой в дБ, что соответствует obj
.
Но я не понимаю, почему это не разрешено, потому что это, кажется, очень простой случай обслуживания транзакций, когда мы хотим убедиться, что определенная строка не обновляется другими потоками после того, как мы прочитаем и перед тем, как мы обновим Это.
Я что-то упустил? Если это не разрешено, как мне сделать это иначе?