• MongoDB多个collection更新的Transaction 实现


    MongoDB中,多个集合的事务管理主要适用于MongoDB的4.0版本及以上,因为MongoDB从4.0开始支持多文档事务。在Node.js环境下,如果你使用mongoose作为ORM库,可以利用其内置的事务支持来进行跨多个集合的操作。

    下面是一个使用mongoose进行多集合事务管理的例子:

    const mongoose = require('mongoose');
    
    // 首先确保连接到MongoDB 4.0+版本的集群
    mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true });
    
    // 定义你的模型
    const CourseSchema = new mongoose.Schema({ /* ... */ });
    const StudentSchema = new mongoose.Schema({ /* ... */ });
    const Course = mongoose.model('Course', CourseSchema);
    const Student = mongoose.model('Student', StudentSchema);
    
    async function handleTransaction(studentId, courseId, newCourseName) {
      const session = await mongoose.startSession(); // 创建一个会话
      session.startTransaction(); // 开启事务
    
      try {
        // 更新课程集合
        await Course.findByIdAndUpdate(courseId, { name: newCourseName }, { session });
    
        // 更新学生集合中的关联课程信息
        await Student.findByIdAndUpdate(studentId, { 'courses.$[element].name': newCourseName }, 
          { arrayFilters: [{ 'element._id': courseId }], session });
    
        // 提交事务
        await session.commitTransaction();
        console.log('Transaction committed successfully');
      } catch (error) {
        // 如果出现错误,则回滚事务
        if (session.inTransaction()) {
          await session.abortTransaction();
          console.error('Transaction aborted due to error:', error);
        }
      } finally {
        // 结束会话
        session.endSession();
      }
    }
    
    handleTransaction(someStudentId, someCourseId, 'New Course Name');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在这个例子中,我们首先创建了一个mongoose会话并开启事务,然后依次更新了两个集合,并在所有操作成功完成后提交事务。如果在事务执行过程中遇到任何错误,则会回滚事务以保持数据一致性。最后,无论事务是否成功,都要记得结束会话。

  • 相关阅读:
    SQL每日一练(牛客新题库)——第5天:高级查询
    部署gitlab,模拟开发流程。
    OSINT 和 15 大开源情报工具
    第五站:操作符(第二幕)
    cpp primer plus笔记06-函数
    servlet的生命周期
    SMT32H7系列DMA和DMAMUX的一点理解
    说一说PCIe5.0的速率和带宽
    Mybatis中使用了哪些设计模式
    Git忽略文件的几种方法,以及.gitignore文件的忽略规则
  • 原文地址:https://blog.csdn.net/qq_35374791/article/details/137875797