Mongoose 是一个非常流行的 Node.js ORM(对象关系映射)库,其支持 MongoDB 数据库。它提供了方便的数据模型定义、查询语句构建、中间件扩展等功能,让开发者可以更简单地操作数据库。在实际应用中,我们可能需要进行复杂的事务操作,如数据库中多个文档的修改、删除、插入等操作,而这些操作必须保证原子性,否则可能会引发严重的数据一致性问题。下面,将介绍如何使用 Mongoose 进行事务操作,保证操作的原子性和正确性。
开始之前的准备
首先,需要确保我们安装了最新版的 MongoDB(支持事务)。然后,我们安装 Mongoose:
npm install mongoose
我们还需要导入以下包:
const mongoose = require('mongoose'); const { Schema } = mongoose;
开启事务
在 Mongoose 中,我们通过调用 mongoose.startSession()
开启一个会话(session)对象,然后调用 session.startTransaction()
开始一个事务。下面是一个示例代码:
const session = await mongoose.startSession(); session.startTransaction();
注意,Mongoose 的事务只能在集合(collection)级别上进行,不能跨数据库。
事务操作
事务中的操作和平时操作一样,我们只需要使用 Mongoose 提供的 API 进行操作即可。需要注意的一点是,我们需要明确指定操作的 session 对象,以保证事务的正确性。下面是一些事务操作的示例代码:
const user = new UserModel({ name: 'test' }); await user.save({ session }); await UserModel.updateOne({ name: 'test' }, { age: 18 }, { session }); await UserModel.deleteOne({ age: 18 }, { session });
在事务中,我们也可以进行嵌套操作,即调用另一个事务操作。这时,我们需要使用 session.withTransaction()
方法,将子操作传递给父操作,下面是示例代码:
-- -------------------- ---- ------- ----- ----------------------------- -- -- - ----- --------------------- ----- ------ --- ----- ----------------------------- -- -- - ----- -------------------- - ----- ----- -- - ---- -- -- - ------- -- -- --- ---
需要注意的是,嵌套的事务必须在父事务内完成,如果父事务失败回滚,则所有子事务都会被回滚。
提交或回滚事务
当事务操作完成后,我们可以调用 session.commitTransaction()
提交事务,或者调用 session.abortTransaction()
回滚事务。需要注意的是,回滚调用后,所有操作都将被撤销,事务中间可能的数据状态将被还原。下面是示例代码:
await session.commitTransaction(); session.endSession();
await session.abortTransaction(); session.endSession();
实现 MongoDB 事务操作的完整示例
下面是一个实现 MongoDB 事务操作的完整示例代码:
-- -------------------- ---- ------- ----- -------- - -------------------- -------- ------------------------------------------ - ---------------- ----- ------------------- ---- -- -------- -- ---------------------- -- ---------- ------------ -- -------------------- ----- - ------ - - --------- ----- ---------- - --- -------- ----- ------- ---- ------- --- ----- --------- - ---------------------- ------------ ----- -------- -------------------- - --- ------- - ----- --- - ------- - ----- ------------------------ --------------------------- ----- ---- - --- ----------- ----- ------ --- ----- ----------- ------- --- ----- --------------------- ----- ------ -- - ---- -- -- - ------- --- ----- --------------------- ---- -- -- - ------- --- ----- ----------------------------- -- -- - ----- --------------------- ----- ------ --- ----- ----------------------------- -- -- - ----- -------------------- - ----- ----- -- - ---- -- -- - ------- -- -- --- --- ----- ---------------------------- --------------------- ------------------------ --------- --------------- - ----- ----- - -- --------- - ----- --------------------------- --------------------- -------------------------- ---------- - ------------------- - - ---------------------
总结
Mongoose 支持 MongoDb 的事务操作,并且使用起来十分方便。我们只需要按照上面的步骤开启事务,进行需要的操作,然后提交或回滚事务即可。在实际的项目中,我们应该根据具体的需求,结合 Mongoose 提供的其他 API,或者通过自定义的 schema 中间件等进行更复杂的操作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64717289968c7c53b0f50840