赞
踩
加了读锁,只允许别的事务继续加读锁而不能加写锁,也就是只读。
用法是SELECT … LOCK IN SHARE MODE
加了写锁,别的事务不允许加任何锁。
用法师SELECT…FOR UPDATE
意向锁在 InnoDB 中是表级锁,用来表达一个事务想要获取什么。
意向锁主要是针对整表的锁
意向锁间相互兼容,对行级锁不生效
先放意向锁的兼容图
单论意向锁,上面的图只看一半会更好理解,以此列举几种场景
1.不使用意向锁
A使用排他锁锁住了user表的id=5的这行数据,并未添加意向锁。
B使用排它锁锁user表,会先去判断每一行是否存在排他锁,效率非常的慢。
2.使用意向排他锁(IX)
A使用排他锁锁住了user表的id=5的这行数据,并对user表加了意向排他锁。
B使用排它/共享锁去锁user表,如果A表存在意向锁,则加锁失败。
即IX和X与S都冲突
3.使用意向共享锁(IS)
若A使用共享锁锁住了user表的id=5的这行数据,并对user表加了意向共享锁。
若B使用共享锁锁user表,而共享锁与意向共享锁是兼容的,所以B加锁成功。
若B使用排他锁锁user表,而排他锁与意向共享锁是冲突的,所以B加锁失败。
即IS与X冲突,与S兼容。
4.意向锁与意向锁兼容
A申请user表的意向共享锁,并锁住id=5这行数据
B申请user表的意向共享锁,并锁住id=6这行数据
B申请user表的意向排他锁,并锁住id=7这行数据
也就是因为意向锁之间相互兼容,所以意向锁对行级锁之间是不冲突的。
当获取某一行锁的同时也会获取对应表的意向锁
1.意向排他锁和共享锁与排他锁冲突
(锁住一行的写锁,其他事务不可获取该表任何锁)
2.意向共享锁和共享锁兼容,和排他锁冲突
(锁住一行的读锁,另一事务可获取该表的读锁,不可获取该表的写锁)
3.意向锁之间相互兼容
(行锁之间不冲突)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。