'Incrementing a counter in DynamoDB when value to be updated is in a map field

I have a lambda function that needs to retrieve an item from DynamoDB and update the counter of that item. But..

The DynamoDB table is structured as:

id: int
options: map
    some_option: 0
    some_other_option: 0

I need to first retrieve the item of the table that has a certain id and a certain option listed as a key in the options.

Then I want to increment that counter by some value.

Here is what I have so far:

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('options')

response = None
try:
    response = table.get_item(Key={'id': id})
except ClientError as e:
    print(e.response['Error']['Message'])

option = response.get('Item', None)
if option:
    option['options'][some_option] = int(option['options'][some_option]) + some_value
    # how to update item in DynamoDB now?

My issues is how to update the record now and more importantly will such solution cause data races? Could 2 simultaneous lambda calls that try to update the same item at the same option cause data races? If so what's the way to solve this?

Any pointers/help is appreciated.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source