原子性和事务处理是数据库操作的核心,保证了数据的准确性。依据数据库原子性,数据库和使用数据库的人员定义事务处理的方式。本文依据Mongodb的官方文档,整理Mongodb数据库的原子性和事务处理方法。
Mongodb的原子操作
Mongodb中,对单个文档的操作是原子的,即使一次文档更新中,更新了文档的多个嵌入文档,这个更新操作也是原子操作。
当文档写入更新语句更新多个文档时,该操作不是原子的。如使用updateMany更新多个文档,insertMany向集合中插入多条数据,这样的操作都不是原子的。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命令
- 多文档事务中,禁止使用创建删除集合和索引这种对已有数据库结构有影响的操作。但允许操作事务中添加新的集合和索引。
原文地址:https://blog.csdn.net/wilsonzane/article/details/134714886
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_17779.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!