API-интерфейс транзакций DynamoDB: невозможно добавить addConditionCheck для того же элемента, который будет обновлен в той же транзакцииWriteRequest? - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь выполнить некоторые операции с таблицей 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.


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

Я что-то упустил? Если это не разрешено, как мне сделать это иначе?

1 Ответ

0 голосов
/ 06 июля 2019

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

На странице, на которую вы ссылаетесь, есть два примера проверки условий. Если вы хотите проверить состояние элемента, который вы обновляете, вы должны следовать примеру метода testPutWithConditionalUpdateInTransactionWrite().

...