MongoDB 如何执行事务/加锁?
参考答案:
MongoDB 从 4.0 版本开始支持多文档事务。这允许你在同一集合或不同集合的多个文档上执行一系列操作,同时确保这些操作的原子性、一致性、隔离性和持久性(ACID 属性)。
以下是使用 MongoDB 执行事务的基本步骤:
- 开始会话: 在 MongoDB 客户端中,你需要首先开始一个会话(session)。会话是客户端与数据库之间的事务性交互的上下文。
const session = client.startSession();
- 使用会话执行操作: 在会话的上下文中,你可以执行读取和写入操作。
session.startTransaction();
try {
// 执行一些操作,例如插入、更新或删除
const collection = session.getDatabase('yourDatabase').getCollection('yourCollection');
const result = collection.insertOne({ ... }, { session: session });
// 提交事务
session.commitTransaction();
} catch (error) {
// 发生错误时回滚事务
session.abortTransaction();
throw error;
} finally {
// 结束会话
session.endSession();
}
- 处理错误: 如果在事务执行过程中发生错误,你应该捕获这个错误并回滚事务。这确保了事务的原子性,即要么所有操作都成功,要么都不成功。
- 结束会话: 无论事务成功还是失败,你都应该确保结束会话以释放资源。
关于加锁:
MongoDB 使用多版本并发控制(MVCC)来提供事务的隔离性,而不是传统的锁机制。这意味着,当一个事务正在修改数据时,其他读取操作仍然可以看到数据的一致快照,而不是被锁定的数据。这种设计有助于提高并发性能。
但是,需要注意的是,虽然 MVCC 减少了锁的需求,但在某些情况下,MongoDB 可能仍然会使用锁来确保数据的一致性。例如,当执行某些特定的全局操作(如集合级别的写锁)时。
总之,MongoDB 的事务和隔离机制主要依赖于 MVCC,而不是传统的锁机制。这使得 MongoDB 在处理高并发场景时能够提供更好的性能。