Sankalp Sharma
Sankalp Sharma

Reputation: 51

Update attributes using UpdateItemEnhancedRequest - DynamoDbEnhancedClient

As per DynamoDb Java Sdk2, the Update operation can be performed as

DynamoDbTable<Customer> mappedTable = enhancedClient.table("Customer", TableSchema.fromBean(Customer.class));
Key key = Key.builder()
          .partitionValue(keyVal)
          .build();
Customer customerRec = mappedTable.getItem(r->r.key(key));
customerRec.setEmail(email);
mappedTable.updateItem(customerRec);
  1. Shouldn't this will cause two calls to dynamoDB
  2. What if after fetching the record and before updateItem call, another thread updated the record, so we have to put it into a transaction as well

Although there is another way by using UpdateItemEnhancedRequest

final var request = UpdateItemEnhancedRequest.builder(Customer.class)
        .item(updatedCustomerObj)
        .ignoreNulls(Boolean.TRUE)
        .build();
    mappedTable.updateItem(request);

but this would require using ignoreNulls(TRUE) and will not handle updates in case null value is to be set.

What should be the optimized way for update operation using enhanced client

Upvotes: 1

Views: 2209

Answers (1)

Borislav Stoilov
Borislav Stoilov

Reputation: 3697

For 1:

I don't like this part of the SDK but the "non-enhanced" client can update without first querying for the entity.

    UpdateItemRequest updateItemRequest = UpdateItemRequest
            .builder()
            .tableName("Customer")
            .key(
                    Map.of(
                            "PK", AttributeValue.builder().s("pk").build(),
                            "SK", AttributeValue.builder().s("sk").build()
                    ))
            .attributeUpdates(
                    Map.of(
                            "email", AttributeValueUpdate.builder()
                                            .action(AttributeAction.PUT)
                                            .value(AttributeValue.builder().s("[email protected]").build())
                                    .build()
                    ))
            .build();
    client.updateItem(updateItemRequest);

For 2:

Yes, you are absolutely right that can happen and will lead to data inconsistency. To avoid this you should use conditional write/update with a version. Luckily we have a Java annotation for this

@DynamoDBVersionAttribute
public Long getVersion() { return version; }
public void setVersion(Long version) { this.version = version;}

More info here

Upvotes: 2

Related Questions