Amazon web services 由多台机器-多个线程一致地修改DynamoDB表中的同一项
我在DynamoDB表中有一个项目(编号)。该值在服务中读取、递增并更新回表。有多台机器,多个线程同时执行此操作。 我这里的问题是能够读取正确的一致值,并使用正确的值进行更新 我尝试在java同步块中执行增量和更新。Amazon web services 由多台机器-多个线程一致地修改DynamoDB表中的同一项,amazon-web-services,amazon-dynamodb,consistency,Amazon Web Services,Amazon Dynamodb,Consistency,我在DynamoDB表中有一个项目(编号)。该值在服务中读取、递增并更新回表。有多台机器,多个线程同时执行此操作。 我这里的问题是能够读取正确的一致值,并使用正确的值进行更新 我尝试在java同步块中执行增量和更新。 然而,我最终还是注意到了计数的不一致性。它似乎没有以一致的方式进行更新。对于每个记录存储,都有一个uuid(长随机字符串)类型的值,每当您尝试使用更新请求更新记录发送时,uuid应该等于您读取的值。并更新uuid值 如果您试图同时从多台计算机写入数据,则同步块将不起作用。每当您试图
然而,我最终还是注意到了计数的不一致性。它似乎没有以一致的方式进行更新。对于每个记录存储,都有一个uuid(长随机字符串)类型的值,每当您尝试使用更新请求更新记录发送时,uuid应该等于您读取的值。并更新uuid值
如果您试图同时从多台计算机写入数据,则同步块将不起作用。每当您试图使用更新请求更新记录发送时,每个记录存储都会有一个uuid(长随机字符串)类型的值,uuid应该等于您读取的值。并更新uuid值 如果您试图同时从多台计算机写入数据,则同步块将不起作用。我的问题是无法读取正确的一致值,并使用正确的值进行更新。 读取/写入正确的一致值
- 在dynamodb中读取一致性(您可以在查询中将其设置为ConsistentRead参数):
- 有两种类型的读取。
- 最终一致读取:若在表中的更改之后读取数据,那个么可能会过时,需要等待一段时间才能保持一致李>
- 强一致性数据:它返回最新的数据,因此不必担心过时的数据
- 有两种类型的读取。
- 条件表达式(在查询中指定):
- 在查询中,如果某些条件为真,您可以指定更新该值(例如,db中的当前值与您以前读取的值相同。这意味着其间没有人更新它),否则它将返回ConditionalCheckFailedException,您需要在代码中处理它以重做
"TableName": "counters",
"ReturnValues": "UPDATED_NEW",
"ExpressionAttributeValues": {
":a": currentValue,
":bb": newValue
},
"ExpressionAttributeNames": {
"#currentValue": "currentValue"
},
**// current value is what you ve read
// by Strongly Consistent **
"ConditionExpression": "(#currentValue = :a)",
"UpdateExpression": "SET #currentValue = :bb", // new counter value
“我这里的问题是能够读取正确的一致值,并使用正确的值进行更新。”
读取/写入正确的一致值
- 在dynamodb中读取一致性(您可以在查询中将其设置为ConsistentRead参数):
- 有两种类型的读取。
- 最终一致读取:若在表中的更改之后读取数据,那个么可能会过时,需要等待一段时间才能保持一致李>
- 强一致性数据:它返回最新的数据,因此不必担心过时的数据
- 有两种类型的读取。
- 条件表达式(在查询中指定):
- 在查询中,如果某些条件为真,您可以指定更新该值(例如,db中的当前值与您以前读取的值相同。这意味着其间没有人更新它),否则它将返回ConditionalCheckFailedException,您需要在代码中处理它以重做
"TableName": "counters",
"ReturnValues": "UPDATED_NEW",
"ExpressionAttributeValues": {
":a": currentValue,
":bb": newValue
},
"ExpressionAttributeNames": {
"#currentValue": "currentValue"
},
**// current value is what you ve read
// by Strongly Consistent **
"ConditionExpression": "(#currentValue = :a)",
"UpdateExpression": "SET #currentValue = :bb", // new counter value