2015年(29)
分类: 系统运维
2015-07-30 10:41:45
锁的互斥与兼容关系
锁和锁之间的关系,要么是相容的,要么是互斥的。
锁a和锁b相容是指:操作同样一组数据时,如果事务t1获取了锁a,另一个事务t2还可以获取锁b;
锁a和锁b互斥是指:操作同样一组数据时,如果事务t1获取了锁a,另一个事务t2在t1释放锁a之前无法获取锁b。
上面提到的共享锁、排它锁、意向共享锁、意向排它锁相互之前都是有兼容/互斥关系的,可以用一个兼容性矩阵表示(y表示兼容,n表示不兼容):
如果一个事务请求的锁模式和当前的锁模式兼容,innodb就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。
意向锁是innodb自动加的,无需用户干预。
对于update,delete,insert语句,innodb会自动给数据集加排它锁(X);对于普通的select语句,innodb不会加任何锁。事务可以通过lock in share mode/for update 显式给记录集加共享锁或者排它锁。
用select ... in share mode获得共享锁,主要用于需要数据依存关系时来确认某行记录是否存在,并确保没有人对该记录进行更新操作。如果当前事务同时也对该条记录进行更新操作,很可能会造成死锁。对于锁定行记录后需要进行更新操作的应用,应该使用select .... for update方式获得排它锁。