原子性和事务处理是数据库操作的核心,保证了数据的准确性。依据数据库原子性,数据库和使用数据库的人员定义事务处理的方式。本文依据Mongodb的官方文档,整理Mongodb数据库的原子性和事务处理方法。
Mongodb的原子操作
Mongodb中,对单个文档的操作是原子的,即使一次文档更新中,更新了文档的多个嵌入文档,这个更新操作也是原子操作。
多文档事务
为了保证多文档事务的原子性,mongodb给出了多文档事务解决方案。
- 在mongodb 4.0版本,mongodb 复制集支持多文档事务
- 在mongodb4.2及以后版本,mongodb引入的分布式事务,添加了分片集群和复制集群的事务支持。通过分布式事务管理,mongodb能够保证跨文档,跨集合,跨数据库和不同数据库分片的操作事务管理。
多文档事务是原子性的。当事务提交时,所有在事务中修改的文档都会被保存,更新后的数据对事务外部可见。如果事务中的部分操作需要回滚,整个事务中的操作都不会被提交。事务中所有需要更新的数据保持不变。
多文档事务中的操作
- 事务中允许操作来自不同数据库的集合
- 禁止为包含多个分片数据集的事务添加新集合,如果开发人员在一个分片中写数据,在另一个分片中隐式添加新的集合,mongodb事务中并不会执行这两个操作
- 不可以在限制集合中写入数据
- 读取限制集合数据时,不可以使用snapshot读取策略。使用“snapshot”策略时, mongodb只能获取到不同分片区上一次majority-committed提交的数据
- 事务中不可以读写config, admin, local数据库中的集合
- 禁止向system.*集合写入数据。system.*是mongodb保留数据集合
- 事务中不支持查看执行计划,不能在查询语句中使用explain()
- 事务外部创建的cursor, 不可以在事务内部调用getMore()方法获取下一批查询数据
- 事务内部创建的cursor, 不可以在事务外部调用getMore()方法
- 自版本4.2开始,事务中第一步,不可以使用killCursors命令
- 多文档事务中,禁止使用创建删除集合和索引这种对已有数据库结构有影响的操作。但允许操作事务中添加新的集合和索引。