在 MongoDB 中进行事务处理可以在多个操作之间维护 ACID 事务特性,实现多文档事务操作。MongoDB 的事务处理采用多文档事务实现了单个事务跨越多个文档,多条记录的操作,这对于需要维护数据完整性的应用程序非常有用。本文将对 MongoDB 中的事务处理进行详细介绍,包括事务概念、使用规则、事务示例代码。
事务概念
事务是指一组可以执行的操作,这些操作被视为一个逻辑单元,如果其中一个操作失败,可能会撤销所有的操作,以确保数据库保持一致状态。MongoDB 中的事务处理基于多文档事务(MDT)的概念,支持事务操作跨文档、跨集合等操作。MongoDB 使用写入协议的方式实现事务,确保 ACID 特性的维护。
- A:原子性(Atomicity),指事务通过单个、不可再分的操作单元来定义,完成所有操作或者不完成。
- C:一致性(Consistency),指事务要么全部成功,要么全部失败,不会出现部分成功或部分失败的情况。
- I:隔离性(Isolation),指多个事务并发执行时,每个事务对其他事务是隔离的。
- D:持久性(Durability),指在事务成功后,所做的修改将保存在数据库中,并持久化在磁盘上。
使用规则
MongoDB 支持全局事务、集合事务和分片集群间的事务。在使用事务前,需要确保以下环境:
- MongoDB 版本必须高于 4.0。
- 每个 MongoDB节点必须启用副本集。
- MongoDB 副本集必须具有读写节点或仲裁节点,以实现主节点的选举。
开始事务
在 MongoDB 中开启一个事务可以通过 startSession
方法开始,如下所示:
// 启动新的 MongoDB 事务 const session = db.getMongo().startSession(); session.startTransaction();
在一个事务内,可以对多个文档集合进行操作,一旦事务开始,所有与事务相关的操作都应该在当前事务上下文中处理。
提交和回滚事务
完成所有的事务操作后,可以通过调用 commitTransaction
或 abortTransaction
方法提交或回滚事务。如果在提交事务之前发生异常,可以通过调用 abortTransaction
方法回滚事务。
-- -------------------- ---- ------- ----- ------- - ----------------------------- --------------------------- --- - ------ ------- ---------------------------- - ------------ - --------------------------- -
事务范围
MongoDB事务的范围在于支持多个集合和分片事务的跨集合操作。下面的示例说明了如何在跨集合事务中使用 mongodb 来维护事务的边界:
session.withTransaction(() => { users.insertOne({ name: "Tom" }); orders.insertOne({ user: "Tom", price: 19.99 }); }, { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } });
事务示例代码
以下示例共涉及到 3 个集合。在执行事务时会获取名称为 collection1
、 collection2
和 collection3
的集合。此示例涉及到插入、更新、删除文档的操作以及回滚,所有事务操作都必须在 currentSession
上下文中执行:
-- -------------------- ---- ------- ----- ------- - ----------------------------- --- - -- --------- --------------------------- -- -------- ----- ----------- - -------------------------------------------------- ----- ----------- - -------------------------------------------------- ----- ----------- - -------------------------------------------------- -- ------- - ----- ----------------------- ---- -- ----- ----- --- -- ------- - ----- ----------------------- ---- - -- - ----- - ----- ------- - --- -- ------- - ----- ----------------------- ---- - --- -- -------- ----- ---------------------------- - -------- - -- --------- ----- --------------------------- ----- -- - ------- - --------------------- -
总结
MongoDB多文档事务可以跨集合、文档进行操作,支持 ACID 特性,可以满足对数据完整性要求比较高的应用场景。上文介绍了 MongoDB 事务的概念、使用规则和示例代码,通过学习可以更好地理解事务处理的概念,提升开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a9291b48841e98945718c0