Amazon dynamodb 是否可以同时扫描以查找项目,然后在DynamoDB中的Transaction中对其进行更新

Amazon dynamodb 是否可以同时扫描以查找项目,然后在DynamoDB中的Transaction中对其进行更新,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我正在使用Lambda和DynamoDB编写一个应用程序,它有一个充满代码的表,可以标记为打开或赎回。我想扫描表以找到1个打开的代码,然后更新它以将其标记为已赎回。然而,这似乎涉及另一个并发Lambda函数的潜在问题,该函数也会扫描,在打开时找到相同的代码,然后两者都将其标记为已赎回 因此,我的解决方案是将扫描和更新放在事务中,但是从我所能告诉您的,您只能在事务中获取项目,或者在事务中写入项目,而不能两者兼而有之 我的表格结构相当简单: { "code": "

我正在使用Lambda和DynamoDB编写一个应用程序,它有一个充满代码的表,可以标记为打开或赎回。我想扫描表以找到1个打开的代码,然后更新它以将其标记为已赎回。然而,这似乎涉及另一个并发Lambda函数的潜在问题,该函数也会扫描,在打开时找到相同的代码,然后两者都将其标记为已赎回

因此,我的解决方案是将扫描和更新放在事务中,但是从我所能告诉您的,您只能在事务中获取项目,或者在事务中写入项目,而不能两者兼而有之

我的表格结构相当简单:

{
   "code": "some code", (primary key)
   "status": "open|redeemed",
   ... other metadata
}
使用传统的关系数据库,过程会很简单,如下所示:

开始交易;
从status=“open”limit 1的代码中选择代码;
更新代码集status=“已赎回”,其中代码=%s;
犯罪

有没有一种方法可以使用非键属性自动查找和更新1条记录?或者我必须找到另一个解决方案,这个问题有解决方案吗?

您不能在事务中进行扫描,但是,有一种方法可以确保该项目只使用一次。如果您向更新中添加了一个,那么如果另一个先到达,则可能会导致更新失败。然后,您可以捕获该异常并尝试另一个异常

更新看起来像这样(使用JavaScript DocumentClient):


我想了解你的访问模式。你能澄清一下你所说的“扫描表格以找到一个打开的代码”是什么意思吗?您是通过代码获取特定的“交易”,还是只是随机选择一个打开状态的代码?@SethGeoghegan我想任意选择任何打开的代码。最后,我添加了一个二级索引,以跟踪哪些代码是开放的,哪些代码是赎回的。
client.update({
  TableName: myTableName,
  Key: { code: codeToRedeem },
  UpdateExpression: 'SET #status = :redeemed',
  ConditionExpression: '#status != :redeemed,
  ExpressionAttributeNames: {
    '#status': 'status'
  },
  ExpressionAttributeValues: {
    ':redeemed': 'redeemed'
  }
});