【发布时间】:2021-04-21 22:58:18
【问题描述】:
我在 DynamoDB 中有两个表,想对这两个表执行 PUT 和 Update 操作。以下是参数:
{
"TransactItems": [
{
"Put": {
"Item": {
"ref": 0,
"date": 0
},
"TableName": "dev-table"
}
},
{
"Put": {
"Item": {
"ref": 1,
"date": 0
},
"TableName": "dev-table"
}
},
{
"Update": {
"TableName": "dev-table-metadata",
"Key": {
"metaDataKey": "refConsumed"
},
"ExpressionAttributeValues": {
":s": 1
},
"UpdateExpression": "SET metaDataValue = :s",
"ReturnValues": "ALL_NEW"
}
}
]
}
因此,dev-table 上发生了两个 Put 操作,dev-table-metadata 上发生了一个 Update 操作
我在循环中触发transactWrite 10 次,返回的响应正常,但是对于几次迭代,我得到以下错误
TransactionCanceledException: Transaction cancelled, please refer cancellation reasons for specific reasons [None, None, TransactionConflict]
我的假设是,在这些情况下,整个事务应该被取消,但前两个 Put 操作被写入表,而最后一次更新不是。
【问题讨论】:
-
您是否总是发送相同的交易?在这种情况下,它仍然可能是以前请求的结果。
-
每次迭代的所有三个操作都有新的价值。我在节点 lambda 中执行此操作,如下所示
let dynamo = new AWS.DynamoDB.DocumentClient(); dynamo.transactWrite(params, function(err, data) { ... }) -
我设法找出了这种行为背后的原因。这是因为
TransactWriteItems命令的异步性质。所以基本上在从 1 到 10 的 for 循环中,触发了 10 个TransactWriteItems命令并且它们以异步方式完成。所以当我查看最后的 db 表时,我认为这些事务不是 ACID。根据我的用例,我需要以同步方式运行这些。无论如何感谢您的帮助@Maurice
标签: amazon-web-services amazon-dynamodb