Amazon web services 由多台机器-多个线程一致地修改DynamoDB表中的同一项

Amazon web services 由多台机器-多个线程一致地修改DynamoDB表中的同一项,amazon-web-services,amazon-dynamodb,consistency,Amazon Web Services,Amazon Dynamodb,Consistency,我在DynamoDB表中有一个项目(编号)。该值在服务中读取、递增并更新回表。有多台机器,多个线程同时执行此操作。 我这里的问题是能够读取正确的一致值,并使用正确的值进行更新 我尝试在java同步块中执行增量和更新。 然而,我最终还是注意到了计数的不一致性。它似乎没有以一致的方式进行更新。对于每个记录存储,都有一个uuid(长随机字符串)类型的值,每当您尝试使用更新请求更新记录发送时,uuid应该等于您读取的值。并更新uuid值 如果您试图同时从多台计算机写入数据,则同步块将不起作用。每当您试图

我在DynamoDB表中有一个项目(编号)。该值在服务中读取、递增并更新回表。有多台机器,多个线程同时执行此操作。 我这里的问题是能够读取正确的一致值,并使用正确的值进行更新

我尝试在java同步块中执行增量和更新。
然而,我最终还是注意到了计数的不一致性。它似乎没有以一致的方式进行更新。

对于每个记录存储,都有一个uuid(长随机字符串)类型的值,每当您尝试使用更新请求更新记录发送时,uuid应该等于您读取的值。并更新uuid值


如果您试图同时从多台计算机写入数据,则同步块将不起作用。

每当您试图使用更新请求更新记录发送时,每个记录存储都会有一个uuid(长随机字符串)类型的值,uuid应该等于您读取的值。并更新uuid值

如果您试图同时从多台计算机写入数据,则同步块将不起作用。

我的问题是无法读取正确的一致值,并使用正确的值进行更新。

读取/写入正确的一致值

  • 在dynamodb中读取一致性(您可以在查询中将其设置为ConsistentRead参数):
    • 有两种类型的读取。
      • 最终一致读取:若在表中的更改之后读取数据,那个么可能会过时,需要等待一段时间才能保持一致
      • 强一致性数据:它返回最新的数据,因此不必担心过时的数据

  • 条件表达式(在查询中指定):
    • 在查询中,如果某些条件为真,您可以指定更新该值(例如,db中的当前值与您以前读取的值相同。这意味着其间没有人更新它),否则它将返回ConditionalCheckFailedException,您需要在代码中处理它以重做
因此,要回答您的问题,首先需要准备好“强一致性”,以获取当前计数器的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,您需要在代码中处理它以重做
因此,要回答您的问题,首先需要准备好“强一致性”,以获取当前计数器的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