MySQL中提供了两种封锁粒度:行级锁和表级锁。
应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,并发锁争用的可能性越小,系统的并发程度越高。
但是加锁需要消耗资源,锁的各种操作(包括获取锁、释放锁、以及检查锁状态)都会增加系统开销。因此封锁粒度越小,系统开销越大。
在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。
封锁类型
1.读写锁
- 排它锁(Exclusive),简写为X锁,又称写锁。
- 共享锁(Shared),简写为S锁,又称读锁。
有以下两个规定: - 一个事务对数据对象A加了X锁,就可以对A进行读取和更新。加锁期间其它事务不能对A加任何锁。
- 一个事务对数据对象A加了S锁,可以对A进行读取操作,但是不能进行更新操作。加锁期间其它事务能对A加S锁,但不能加X锁。
2.意向锁
使用意向锁可以更容易地支持多粒度封锁。
在存在行级锁和表级锁的情况下,事务T想对表A加X锁,就需要先检查是否有其它事务对表A或者表A中的任意一行加了锁,那么就需要对表A的每一行都检查一次,这是非常耗时的。
意向锁在原来的X/S锁之上引入了IX/IS,IX/IS都是表锁,用来表示一个事务想要在表中某个数据行上加X锁或S锁。有以下两个规定: - 一个事务在获得某个数据行对象的S锁之前,必须先获得锁的IS锁或者更强的锁;
- 一个事务在获得某个数据行对象的X锁之前,必须先获得锁的IX锁。
通过引入意向锁,事务T想要对表A加X锁,只需要先检测是否有其它事务对表A加了X/IX/S/IS锁,如果加了就表示有其它事务正在使用这个表或者表中某一行的锁,因此事务T加X锁失败。