如何在 MongoDB 中使用多文档事务

数据库NoSQL数据库技术服务知识库
场景介绍

在 MongoDB 中,对单个文档执行的操作是原子操作。 多文档事务使应用程序可以跨多个文档执行原子操作。 从 MongoDB 4.0 版本开始支持基于副本集的多文档事务,从 4.2 版本开始,提供了跨分片的分布式事务 多文档事务遵循 ACID 语义:

  • 原子性:一组操作只会全部成功,或者全部失败
  • 一致性:保证数据库整体数据的完整性和业务数据的一致性
  • 隔离性:事务之间不会相互影响
  • 持久性:事务一旦成功提交,将会进行持久化
操作步骤

使用事务之前,所涉及到的集合必须存在,多文档事务内部不允许执行 createCollection 这样的 DDL 操作,包括由 insert 事件触发的 DDL 行为都将导致报错

  1. 开启事务
mongo:PRIMARY> session = db.getMongo().startSession()
session { "id" : UUID("b06e4a3d-90a2-4987-9aab-11c3873eb4c5") }
mongo:PRIMARY> session.startTransaction()
  1. 在事务中更新文档
mongo:PRIMARY> db.volce.updateOne({ name: "wanyix" }, { $set: { friendOf: "luxinbin" } } )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
mongo:PRIMARY> db.volce.updateOne({ name: "rudonx" }, { $set: { friendOf: "wenjifan" } } )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
在事务中进行查询:
mongo:PRIMARY> db.volce.find();
{ "_id" : ObjectId("650aeb7b1bf0f9e73f3df00c"), "name" : "wanyix", "friendOf" : "luxinbin" }
{ "_id" : ObjectId("650aeb801bf0f9e73f3df00d"), "name" : "rudonx", "friendOf" : "wenjifan" }
  1. 进行事务提交
mongo:PRIMARY> session.commitTransaction()

上述操作可以封装到 js 脚本中进行运行,脚本如下:

var session = db.getMongo().startSession();
var friendsCollection = session.getDatabase("volce").volce;
session.startTransaction();
// start transaction
try {
    friendsCollection.updateOne({ name: "rudonx" }, { $set: { friendOf: "wanyix" } } );
    friendsCollection.updateOne({ name: "wanyix" }, { $set: { friendOf: "wweiam" } } );
} catch (error) {
    // abort transaction on error
    session.abortTransaction();
    throw error;
}

 // commit 
 session.commitTransaction();

运行命令如下:

mongodb://<user>:<password>@mongoxxxx.mongodb.ivolces.com:3717,mongoxxxx.mongodb.ivolces.com:3717/?authSource=admin&replicaSet=rs-mongoxxxx&retryWrites=true <yourscript>.js
参考文档
58
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论