MongoDB

MongoDB 知识量:13 - 42 - 129

7.1 事务简介><

ACID的定义- 7.1.1 -

MongoDB是一个分布式数据库,它支持跨多个操作、集合、数据库、文档和分片的ACID事务。ACID是一个事务所需要具备的一组属性集合,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)和持久性(Durability)。

原子性是指事务中的所有操作要么全部完成,要么全部不完成,不可能停滞在中间某个环节。一致性是指如果事务成功,那么数据库将从一个一致性状态转移到下一个一致性状态。隔离性是允许多个事务同时在数据库中运行,并且一个事务不会看到其他事务的部分结果,这意味着多个事务并行运行于依次运行每个事务所获得的结果都相同。持久性是指即使在出现断电或其它错误的情况下,事务处理的结果也会被永久保存下来。

当数据库满足所有这些属性并且只有成功的事务才会被处理时,它就被称为符合ACID的数据库。MongoDB是一个分布式数据库,它支持跨副本集和跨分片的ACID事务。

如何使用事务- 7.1.2 -

MongoDB支持多文档事务,但需要使用客户端版本>=3.6.0。以下是使用MongoDB事务的要点:

  1. 确保客户端版本>=3.6.0。

  2. 事务仅支持副本集,且必须只在主节点上执行。这是因为事务需要保证隔离性,只有主节点的数据才是最新的和准确的。

  3. 使用传入的session对象启动一个事务。可以通过调用session.startTransaction()方法启动一个事务。

  4. 在事务内执行多个操作,要么全部成功要么全部失败。如果任意操作失败,可以调用session.abortTransaction()回滚事务。

  5. 通过调用session.commitTransaction()提交事务。这会提交事务内的所有操作,并结束当前事务。

  6. 事务支持隔离级别串行化(serializable)。这是最高的隔离级别,可以防止各种并发问题。

  7. 事务允许操作包括:插入、更新、删除 db.collection.findAndModify() db.collection.updateMany() db.collection.deleteMany() db.collection.bulkWrite()。

  8. 事务不支持的操作包括:读取(find)操作、索引和集合创建或删除、登录和权限修改。

注意:使用事务时,应确保在MongoDB的副本集中执行,并且只在该副本集的主节点上执行。

对事务限制进行调优- 7.1.3 -

MongoDB对应用程序的事务限制可以通过以下方式进行调优:

  • 时间限制:事务的默认最大运行时间是1分钟。可以通过在mongod实例级别上修改transactionLifetimeLimitSeconds的限制来增加。

  • Oplog大小限制:这是MongoDB的事务日志条目和单个条目的大小限制。可以根据实际需求进行调整。

  • 找出慢语句:可以使用MongoDB的性能分析工具来找出慢语句,然后对这些语句进行诊断和优化。

  • 创建索引:分析完慢语句后,需要创建新的索引(index)来提升查询的性能。

  • 读写分离:如果读写都在主节点的话,从节点就会一直空置,造成资源浪费。可以考虑进行读写分离,让主节点处理写请求,从节点处理读请求。

在进行以上操作时,需要注意不要违反MongoDB的ACID特性,并且要确保数据的一致性和完整性。