8

We have a microservice written in node.js & we use dynamoDB for data storage. Value is stored in json format against key. In update service call, we fetch value for a key, update the json & save it.

Recently, we came across a condition where 2 calls wanted to update the value of the same key. So first call read the value, then second call read the value, first call updated & saved, then second updated & saved the value (usual case of race condition), so in this case update by first call did not get reflected in DB.

To handle this, I researched a bit & came to know about the transaction library of dynamoDB. But it seems that it is not yet in node-js sdk.

Also, I searched about versioning & optimistic locking but again I did not find a support for this in node-js sdk.

Is there any update with this? If it's support is not going to come in near future in node-js sdk, what are the other options? What could be the best way to handle this issue?

3 Answers 3

14
  1. You can do atomic updates such as incrementing a number straight on Dynamo without reading, incrementing, updating. For more information see this

  2. Are both updates updating the same field? If so you can add a condition to the update that the old value equal what you read. That way if you try to save the 2nd new value, this condition will fail and it won't perform the 2nd update. See this

1
  • Accepting for the second point "ConditionExpression". This should solve the problem.
    – ameykpatil
    Commented Feb 8, 2016 at 10:20
4

Just released at 2018 re:invent, see the native transaction support in javascript sdk usage here: https://aws.amazon.com/blogs/aws/new-amazon-dynamodb-transactions/

2

Recently there is an npm package that provides implementation of DynamoDb optimistic locking. See Dynameh. You can check that out.

Not the answer you're looking for? Browse other questions tagged or ask your own question.