当前位置:   article > 正文

Mysql-innoDB锁总结_排他锁 其他事务能读吗

排他锁 其他事务能读吗

Mysql-innoDB锁总结

对innoDB锁进行一个总结复习


共享锁与排他锁

共享锁(S 锁):其他事务可以读,但不能写。
排他锁(X 锁) :其他事务不能读取,也不能写。

意向锁和表锁

        innoDB为了支持在不同粒度上加锁,所以支持一种额外的加锁方式。
什么意思呢,首先意向锁是一个不会与行锁冲突的表级锁。其次,意向锁之间,即IS与IX之间是互相兼容的。

        那它们互相兼容有什么作用呢?这样不就和没加锁一样?其实意向锁主要是和表级的S锁和X锁互斥,意向锁就是为了告诉表级锁,这张表里面已经有细粒度的锁的了,比如行级的X锁。那么,表级的S锁和X锁就需要等待行级锁释放才能对表上锁。

在这里插入图片描述

例子:
        前提,一个事务要获取到行级的X锁,这时有另一个事务需要获取表级的X锁。又知道innoDB支持不同粒度的锁存在。

        那行级的X锁可以和表级的X锁同时存在吗?同一张表的情况下,同时存在,我行级的X锁就是希望这一行是我的,别人都不许改!那表级的X锁也是希望这张表都是我的,别人不许改!

        结论,行级X锁和表级X锁不可以同时存在。所以就引入了意向锁,在获取行锁前,会先获取粗粒度的意向锁。当我第二个事务要获取到表级X锁的时候,会发现已经有意向锁了,不让你加表级X锁。

        所以意向锁的存在保证了多粒度锁同时存在,支持了不同粒度上进行加锁操作。为什么可以保证,当然是因为意向锁保证了粗粒度和细粒度的锁之间不会干扰到彼此。

行锁实现的三种算法

Record Lock:总是会去锁住索引记录(主键和唯一索引)
Gap Lock: 间隙锁,锁定一个范围
Next-Key Lock: Gap Lock+Record Locd

假设有这样一张表,a是主键索引,b是辅助索引
在这里插入图片描述
        如果对a进行查询,比如select * from test(表名) where a=5,那么只会加上Record Lock,即对聚集索引中列a=5加上X锁。

        但如果对辅助索引b进行查找,比如 select * from test where b=3,那么会对(1,3]加上Next-Key Lock,同时会对下个范围(3,5)加上Gap Lock,还会对b=3对应的主键a=2加上一个Record Lock。也就是对b锁住了(1,5)这个范围,对a锁住了a=2这行。嗯,当然还有我们的粗粒度意向锁。

        next-key Lock解决了不可重复读问题,让innodb的默认隔离级别就是可重复读级别,当辅助索引是唯一修饰时,也就是我们常说的唯一索引,next-key Lock会退化成Record Lock。

自增长锁与外键锁

能力有限,网上也查了一些文章,但看完之后感觉自己没有学出自己的东西,总结不出来。写在这里是因为mysql锁里面是有自增长锁和外键锁的,感兴趣的可以自己去寻找相关的文章学习。以后要是会了,应该我会把这里补充完整。

一致性非锁定读和一致性锁定读

一致性非锁定读是通过多版本并发控制(MVCC)来读取数据。
它是为了提高读操作的效率,不需要等待X锁释放依旧可以访问行上的数据而设计的,是由undo log提供快照数据。

undo log本身就记录了当前行数据之前的历史版本,而每一行可能有不止一个历史版本,由此带来的并发控制,称为多版本并发控制。

对于快照数据,在读已提交的事务隔离级别里,总是读取被锁定行的最新一份快照数据,在可重复读的事务隔离级别李,总是读取事务开始时的行数据版本。innoDB是默认可重复读的。

一致性锁定读,其实就是对读操作加一个X锁,嗯,这个时候一致性非锁定读还是可以读到数据的,毕竟写操作其实也就是加个X锁。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号