MongoDB 4.0 版本引入了事务功能,使其成为一个支持 ACID 事务的 NoSQL 数据库。本文将介绍 MongoDB 的事务功能的使用方法,包括事务的开启、提交、回滚等操作,并提供示例代码。
事务的基本概念
事务是一组原子性操作的集合,这些操作要么全部执行成功,要么全部执行失败。MongoDB 的事务遵循 ACID 原则,即原子性、一致性、隔离性和持久性。
在 MongoDB 中,事务只能在支持事务的数据库中使用,比如副本集和分片集群。
开启事务
在 MongoDB 中,开启事务需要使用 startSession()
方法创建一个会话对象,并在会话对象上调用 startTransaction()
方法。示例代码如下:
const session = db.getMongo().startSession(); session.startTransaction();
执行事务操作
在事务中,所有操作都需要使用会话对象进行,比如插入、更新、删除等操作。示例代码如下:
-- -------------------- ---- ------- ----- ---------- - ------------------------------ ----- ------- - ----------------------------- --------------------------- --- - ---------------------- ----- -------- ---- -- -- - ------- --- ---------------------- ----- ----- -- - ----- - ---- -- - -- - ------- --- ---------------------- ----- --------- -- - ------- --- ---------------------------- - ----- ------- - --------------------------- -
在上面的代码中,我们使用 try-catch
块来捕获可能出现的异常。如果所有操作都执行成功,我们就提交事务,否则就回滚事务。
提交事务
在 MongoDB 中,提交事务需要使用会话对象上的 commitTransaction()
方法。示例代码如下:
const session = db.getMongo().startSession(); session.startTransaction(); try { // 执行事务操作 session.commitTransaction(); } catch (error) { session.abortTransaction(); }
提交事务后,所有操作将被永久保存到数据库中。
回滚事务
在 MongoDB 中,回滚事务需要使用会话对象上的 abortTransaction()
方法。示例代码如下:
const session = db.getMongo().startSession(); session.startTransaction(); try { // 执行事务操作 session.abortTransaction(); } catch (error) { session.abortTransaction(); }
回滚事务后,所有操作将被撤销,数据库将恢复到事务开始前的状态。
事务的隔离级别
在 MongoDB 中,事务的隔离级别有四种,分别是 read uncommitted
、read committed
、repeatable read
和 serializable
。默认情况下,MongoDB 使用 read committed
隔离级别。
我们可以在会话对象上使用 setTransactionOptions()
方法来设置事务的隔离级别。示例代码如下:
const session = db.getMongo().startSession(); session.startTransaction({ readConcern: { level: 'snapshot' }, writeConcern: { w: 'majority' }, readPreference: 'primary', maxCommitTimeMS: 5000, });
在上面的代码中,我们指定了事务的读取一致性级别为 snapshot
,写入确认级别为 majority
,读取偏好为 primary
,最大提交时间为 5 秒。
总结
本文介绍了 MongoDB 的事务功能的使用方法,包括事务的开启、提交、回滚等操作,并提供了示例代码。希望本文能够帮助读者更好地理解和使用 MongoDB 的事务功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6510f10295b1f8cacd953812