参考:http://blog.sina.com.cn/s/blog_a1e9c7910102vkg4.html
| 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
1、表是由行组成的,向某个表加锁时,需要进行两方面的检查:(1)该锁的申请是否与原有表中锁的内容相容(2)检查该锁是否与表中的每一行上的锁的内容相容; 比如:一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也会被阻塞。如果表中数据很多,逐行检查锁标志的开销将很大,系统的性能也会受到影响,为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,则为“意向锁”
2、意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对他的上层结点加意向锁;如:对表中的任一行加锁时,必须先对他所在的表加意向锁,然后在对该行加锁,这样事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统系率大大提高
3、共享锁(S)
共享锁的粒度是行或者元组(多行),一个事务获得了共享锁之后,就可以对锁定范围内的数据进行读操作
4、排它锁(X)
排他锁的粒度是行或者元组(多行),一个事务获得排他锁之后,就可以对锁定范围内的数据执行insert/delete/update操作了
5、意向锁
意向锁是一种表级锁,锁的粒度是整张表,分为意向共享锁(IS)和意向排它锁(IX)
表锁覆盖了行锁的数据,所以表锁和行锁也会产生冲突,比如:
为了方便地检测表级锁和行级锁之间的冲突,于是引入了意向锁。
问题:
IX 与 X冲突,那岂不是任意两个写操作,即使写不同行也会造成死锁
- Session A 请求 IX--成功,Session B请求 IX--成功
- Session A 请求 X,发现已经有其他session有IX,因此冲突
- 同理SessionB请求X也会是这种情况。那这row lock还有什么用?
- IX,IS是表级锁,不会和行级的X,S锁发生冲突。只会和表级的X,S发生冲突
- 行级别的X和S按照普通的共享、排他规则即可。所以之前的示例中第2步不会冲突,只要写操作不是同一行,就不会发生冲突。
当再向一个表添加表级X锁的时候
- 如果没有意向锁的话,则需要遍历所有整个表判断是否有行锁的存在,以免发生冲突
- 如果有了意向锁,只需要判断该意向锁与即将添加的表级锁是否兼容即可。因为意向锁的存在代表了,有行级锁的存在或者即将有行级锁的存在。因而无需遍历整个表,即可获取结果。