CLI命令 - TransactWriteItems

使用TransactWriteItems命令可以将100个写请求同时写到DynamoDB((受4MB事务大小限制)),这些请求可以写到不同表里(但要在相同帐号相同region),这些请求是原子性的,要么全部成功,要么全部失败。

前面的实验中我们有几个表 Forum, ThreadReply。当Reply表中有新记录插入时,我们需要增加Forum表中Message字段的大小,这些操作需要在一个事务中完成。

DynamoDB的事务支持幂等(idempotency),即使将相同的事务提交多次,DynamoDB保证只执行一次

当提交一次事务时,需要指定一个ClientRequestToken(即Idempotency Token,用于保证幂等性)

执行以下命令:

aws dynamodb transact-write-items --client-request-token TRANSACTION1 --transact-items '[
    {
        "Put": {
            "TableName" : "Reply",
            "Item" : {
                "Id" : {"S": "Amazon DynamoDB#DynamoDB Thread 2"},
                "ReplyDateTime" : {"S": "2021-04-27T17:47:30Z"},
                "Message" : {"S": "DynamoDB Thread 2 Reply 3 text"},
                "PostedBy" : {"S": "User C"}
            }
        }
    },
    {
        "Update": {
            "TableName" : "Forum",
            "Key" : {"Name" : {"S": "Amazon DynamoDB"}},
            "UpdateExpression": "ADD Messages :inc",
            "ExpressionAttributeValues" : { ":inc": {"N" : "1"} }
        }
    }
]'

查看Forum的内容,可以看到Messages被加1:

aws dynamodb get-item \
    --table-name Forum \
    --key '{"Name" : {"S": "Amazon DynamoDB"}}'

image-20241226154114432

如果我们再次运行相同的事务命令,并使用相同的client-request-token值,不会返回失败,但Messages属性仍保持在5

最后执行另一个事务来撤消上述操作并清理表:

aws dynamodb transact-write-items --client-request-token TRANSACTION2 --transact-items '[
    {
        "Delete": {
            "TableName" : "Reply",
            "Key" : {
                "Id" : {"S": "Amazon DynamoDB#DynamoDB Thread 2"},
                "ReplyDateTime" : {"S": "2021-04-27T17:47:30Z"}
            }
        }
    },
    {
        "Update": {
            "TableName" : "Forum",
            "Key" : {"Name" : {"S": "Amazon DynamoDB"}},
            "UpdateExpression": "ADD Messages :inc",
            "ExpressionAttributeValues" : { ":inc": {"N" : "-1"} }
        }
    }
]'