是否可以同时扫描以查找项目,然后在 DynamoDB 的事务中更新它
Is it possible to both scan to find an item, then update it in a transcation in DynamoDB
我正在使用 Lambda 和 DynamoDB 编写一个应用程序,其中 table 充满了可以标记为打开或已兑换的代码。我想扫描 table 找到 1 个打开的代码,然后更新它以将其标记为已兑换。然而,这似乎涉及另一个并发 Lambda 函数的潜在问题,该函数也在扫描,在打开时找到相同的代码,然后将其标记为已兑换。
因此我的解决方案是将扫描和更新放在一个事务中,但是据我所知,您只能在事务中获取项目或在事务中写入项目,而不能同时进行。
我的 table 的结构相当简单:
{
"code": "some code", (primary key)
"status": "open|redeemed",
... other metadata
}
使用传统的关系数据库,这个过程会很简单,看起来像这样:
BEGIN TRANSACTION;
SELECT code FROM codes WHERE status="open" limit 1;
UPDATE codes SET status="redeemed" WHERE code=%s;
COMMIT;
有没有办法使用非键属性自动查找和更新 1 条记录?或者我必须找到其他解决方案,这个问题有解决方案吗?
您不能在交易中进行扫描,但是,有一种方法可以确保该项目只使用一次。如果您将 condition expression 添加到您的更新中,您可能会导致更新失败,如果其他人先到达的话。然后您可以捕获该异常并尝试另一个异常。
更新看起来像这样(使用 JavaScript DocumentClient):
client.update({
TableName: myTableName,
Key: { code: codeToRedeem },
UpdateExpression: 'SET #status = :redeemed',
ConditionExpression: '#status != :redeemed,
ExpressionAttributeNames: {
'#status': 'status'
},
ExpressionAttributeValues: {
':redeemed': 'redeemed'
}
});
我正在使用 Lambda 和 DynamoDB 编写一个应用程序,其中 table 充满了可以标记为打开或已兑换的代码。我想扫描 table 找到 1 个打开的代码,然后更新它以将其标记为已兑换。然而,这似乎涉及另一个并发 Lambda 函数的潜在问题,该函数也在扫描,在打开时找到相同的代码,然后将其标记为已兑换。
因此我的解决方案是将扫描和更新放在一个事务中,但是据我所知,您只能在事务中获取项目或在事务中写入项目,而不能同时进行。
我的 table 的结构相当简单:
{
"code": "some code", (primary key)
"status": "open|redeemed",
... other metadata
}
使用传统的关系数据库,这个过程会很简单,看起来像这样:
BEGIN TRANSACTION;
SELECT code FROM codes WHERE status="open" limit 1;
UPDATE codes SET status="redeemed" WHERE code=%s;
COMMIT;
有没有办法使用非键属性自动查找和更新 1 条记录?或者我必须找到其他解决方案,这个问题有解决方案吗?
您不能在交易中进行扫描,但是,有一种方法可以确保该项目只使用一次。如果您将 condition expression 添加到您的更新中,您可能会导致更新失败,如果其他人先到达的话。然后您可以捕获该异常并尝试另一个异常。
更新看起来像这样(使用 JavaScript DocumentClient):
client.update({
TableName: myTableName,
Key: { code: codeToRedeem },
UpdateExpression: 'SET #status = :redeemed',
ConditionExpression: '#status != :redeemed,
ExpressionAttributeNames: {
'#status': 'status'
},
ExpressionAttributeValues: {
':redeemed': 'redeemed'
}
});