赞
踩
对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锁。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。