MongoDB不支持事务

发布于:2025-03-26 ⋅ 阅读:(32) ⋅ 点赞:(0)

 

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用微信支付,扫码加群。由于维护成本问题得不到解决,可能将停止线上维护。

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》
https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》

https://blog.csdn.net/qq_57756904/category_12173599.html

有需求代码永远写不完,而方法才是破解之道,抖音有实战视频课程,某马某千等培训都是2万左右,甚至广东有本科院校单单一年就得3万4年就12万学费,而且还没有包括吃饭的钱。所以很划算了。另外博客左侧有源码阅读专栏,对于求职有很大帮助,当然对于工作也是有指导意义等。在大城市求职,你面试来回一趟多多少少都在12块左右,而且一般不会一次性就通过,还得面试几家。而如果你对源码以及微服务等有深度认识,这无疑给你的面试添砖加瓦更上一层楼。

最后再送一句:最好是学会了,而不是学废了!!

2

实际上,MongoDB 从 4.0 版本开始就支持多文档事务,并且在后续版本中不断完善事务功能。MongoDB 的事务支持使得它能够处理需要 ACID(原子性、一致性、隔离性、持久性)特性的复杂操作。

以下是关于 MongoDB 事务的一些关键点:


1. MongoDB 事务的支持

  • MongoDB 4.0:引入了对副本集(Replica Set)的多文档事务支持。

  • MongoDB 4.2:扩展了事务支持,使其能够在分片集群(Sharded Cluster)中使用。

  • MongoDB 5.0+:进一步优化了事务性能,并提供了更好的开发体验。


2. 事务的使用场景

MongoDB 的事务适用于以下场景:

  • 需要同时更新多个文档或集合的操作。

  • 需要保证数据一致性的复杂业务逻辑。

  • 需要回滚操作的场景。


3. 事务的限制

尽管 MongoDB 支持事务,但仍有一些限制需要注意:

  • 性能开销:事务会增加性能开销,尤其是在分片集群中。

  • 事务时长:默认情况下,事务的最长运行时间为 60 秒,超过后会自动中止。

  • 内存限制:事务会占用额外的内存资源,因此需要合理设计事务范围。

  • 分片集群限制:在分片集群中使用事务时,所有操作必须涉及相同的分片键。


4. 如何使用事务

以下是 MongoDB 事务的基本使用方式(以 Node.js 为例):

示例代码
const { MongoClient } = require('mongodb');

async function runTransaction() {
  const uri = "mongodb://localhost:27017";
  const client = new MongoClient(uri);

  try {
    await client.connect();
    const database = client.db('testdb');
    const collection1 = database.collection('users');
    const collection2 = database.collection('orders');

    // 开始事务
    const session = client.startSession();
    session.startTransaction();

    try {
      // 在事务中执行操作
      await collection1.insertOne({ name: "Alice", age: 25 }, { session });
      await collection2.insertOne({ userId: 1, product: "Laptop" }, { session });

      // 提交事务
      await session.commitTransaction();
      console.log("Transaction committed.");
    } catch (error) {
      // 回滚事务
      await session.abortTransaction();
      console.error("Transaction aborted:", error);
    } finally {
      // 结束会话
      session.endSession();
    }
  } finally {
    await client.close();
  }
}

runTransaction().catch(console.error);

5. 事务的 ACID 特性

MongoDB 的事务支持完整的 ACID 特性:

  • 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。

  • 一致性(Consistency):事务确保数据从一个一致状态转换到另一个一致状态。

  • 隔离性(Isolation):事务中的操作在提交前对其他操作不可见。

  • 持久性(Durability):事务提交后,数据的修改是永久性的。


6. 事务的最佳实践

  • 尽量缩短事务范围:减少事务的持续时间和操作数量,以降低性能开销。

  • 合理设计分片键:在分片集群中使用事务时,确保所有操作涉及相同的分片键。

  • 处理事务冲突:使用重试机制处理事务冲突或失败的情况。

  • 监控事务性能:使用 MongoDB 的监控工具(如 Atlas 或 Compass)跟踪事务的性能和资源使用情况。


7. MongoDB 事务与传统关系数据库事务的区别

  • 性能:MongoDB 的事务性能通常低于传统关系数据库(如 MySQL、PostgreSQL),尤其是在分片集群中。

  • 灵活性:MongoDB 的文档模型提供了更高的灵活性,但事务的设计需要更加谨慎。

  • 使用场景:MongoDB 的事务更适合非结构化或半结构化数据的场景,而关系数据库更适合严格的结构化数据。


总结

MongoDB 从 4.0 版本开始支持多文档事务,并且在后续版本中不断完善。虽然 MongoDB 的事务功能强大,但在使用时需要注意性能开销和设计限制。通过合理使用事务,可以在 MongoDB 中实现复杂的业务逻辑并保证数据的一致性。

3