在 Azure Cosmos DB for MongoDB 中使用多文档事务

适用对象: MongoDB

本文将创建一个 Mongo shell 应用,该应用在 Azure Cosmos DB for MongoDB(服务器版本 4.0)中对固定集合上执行多文档事务。

什么是多文档事务?

在 Azure Cosmos DB for MongoDB 中,对单个文档执行的操作是原子操作。 多文档事务使应用程序可以跨多个文档执行原子操作。 它为操作提供“全或无”语义。 提交时,会保留事务内所做的更改,如果事务失败,则会放弃事务中的所有更改。

多文档事务遵循 ACID 语义:

  • 原子性:将所有操作视为一个操作
  • 一致性:提交的数据有效
  • 隔离:与其他操作隔离
  • 持续性:客户端按指示保留事务数据

要求

版本 4.0 的 API 中的未分片集合支持多文档事务。 版本 4.0 中的跨集合或分片集合不支持多文档事务。 事务超时固定为 5 秒。

支持线路协议版本 4.0 或更高版本的所有驱动程序都会支持 Azure Cosmos DB for MongoDB 多文档事务。

在 MongoDB shell 中运行多文档事务

注意

此示例不适用于 MongoDB 指南针中嵌入的 MongoSH beta (shell)。

  1. 打开命令提示符,转到安装了 Mongo shell 版本 4.0 和更高版本的目录:

    cd <path_to_mongo_shell_>
    
  2. 创建 mongo shell 脚本 connect_friends.js 并添加以下内容

    // insert data into friends collection
    db.getMongo().getDB("users").friends.insert({name:"Tom"})
    db.getMongo().getDB("users").friends.insert({name:"Mike"})
    // start transaction
    var session = db.getMongo().startSession();
    var friendsCollection = session.getDatabase("users").friends;
    session.startTransaction();
    // operations in transaction
    try {
        friendsCollection.updateOne({ name: "Tom" }, { $set: { friendOf: "Mike" } } );
        friendsCollection.updateOne({ name: "Mike" }, { $set: { friendOf: "Tom" } } );
    } catch (error) {
        // abort transaction on error
        session.abortTransaction();
        throw error;
    }
    
    // commit transaction
    session.commitTransaction();
    
  3. 运行以下命令来执行多文档事务。 可以在 Azure 门户中找到主机、端口、用户和密钥。

    mongo "<HOST>:<PORT>" -u "<USER>" -p "KEY" --ssl connect_friends.js
    

后续步骤

探索 Azure Cosmos DB for MongoDB 4.0 中的新增功能