mongo回顾(十二:原子性)

技术分享之后好久没写了,接下来会把我所知道的mongo知识点补完,这篇文章主要聊聊mongodb的事务

mongodb的事务都是需要自己对命令添加属性达到自己想要的结果,因为使用了事务就意味着要加锁,需要时间和空间上的性能消耗,mongo的初衷是很快的获取到数据,因此mongo对事务的支持是随之版本的更新不断完善的

事务.png

原子性
单表单文档原子性
db.username.update({'name': 'helei'}, {$set: {'age': 26, 'score': 85}})

为文档username执行update操作,如果age更新为26,score由于宕机或唯一索引等其他原因导致更新失败,score的字段也不会更新成功

Mongodb使用的是read-write读写锁,允许多个读者并发的加共享锁访问同一资源,而同一时间只允许一个写者加排它锁改变资源,此时不允许其它的读和写。
在mongodb中,还使用了意向锁(IS、IX)提高加锁性能。为了提高吞吐率,在等待排队的锁中,排在最前面的如果是共享锁,会一次把队列中所有的共享锁都加上,释放之后就处理排他锁。而不是当前是共享锁,后面一来共享锁请求都加上去,后面的请求是要排队的,避免写锁的饥饿。

对于意向锁来说,innodb也有,功能差不多,都是数据操作前系统自动添加的,用户无需干预;
简单来说要想获取S锁,就必须获取IS锁
要想获取X锁,就必须获取IX锁
目的是为了事务需要锁表时,通过判断意向锁是否存在,快速返回锁表是否成功(分阶段提高锁的效率)
https://mp.weixin.qq.com/s/aD6AySeHX8uqMlg9NgvppA?spm=a2c6h.12873639.0.0.2c58125budrSER

MongoDB中锁的粒度从 只有全局-》库-》集合层面,不断的优化减少粒度
不过一些全局操作(通常是涉及多个数据库的短期操作)仍然需要全局“实例范围”锁定。其他一些操作(例如删除集合。compact指令)仍需要独占数据库锁。而CRUD就为集合级别的锁了
https://www.bbsmax.com/A/B0zqg9gK5v/
https://docs.mongodb.com/manual/faq/concurrency/
值得注意的是,在前台创建索引时会对集合加排他锁(4.2版本后优化了这一点),后台则不会

Previous versions of MongoDB supported building indexes either in the foreground or background. Foreground index builds were fast and produced more efficient index data structures, but required blocking all read-write access to the parent database of the collection being indexed for the duration of the build. Background index builds were slower and had less efficient results, but allowed read-write access to the database and its collections during the build process.
https://docs.mongodb.com/manual/core/index-creation/#std-label-index-creation-background
https://www.cnblogs.com/usmile/p/13576813.html

复制集多表多行
在4.0版本前多文档跨集合要保持原子性可以使用两段提交的方式,而在4.0及以后可以直接使用官方的多文档事务。
https://mongoing.com/archives/6102
不同于4.0到3.2版本,数据的提交(索引,数据,oplog)是一个整体,4.0版本提供用户一个session来保存多行数据,以此来完成多文档事务

分布式事务
具体我还没深入了解,看以下文章像是使用最终一致性理论
https://mongoing.com/archives/26731

Distributed Transactions and Multi-Document Transactions
Starting in MongoDB 4.2, the two terms are synonymous. Distributed transactions refer to multi-document transactions on sharded clusters and replica sets. Multi-document transactions (whether on sharded clusters or replica sets) are also known as distributed transactions starting in MongoDB 4.2.
事务的大小限制为16M
https://docs.mongodb.com/manual/release-notes/4.2/#distributed-transactions

总结:mongo在4.2版本后就完全支持事务了,对应原子性比mysql支持度还好,mysql的分库事务还需借助其他工具支持。但是mongo不像mysql每个CRUD语法都会开启事务,需要自行开启。持久性的日志上一篇简单聊过了,下一篇我们来聊聊mongo的writeConcern和readConcern

你可能感兴趣的:(mongo回顾(十二:原子性))