意向锁解析

参考:http://blog.sina.com.cn/s/blog_a1e9c7910102vkg4.html

|         表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

l         行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
l         页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

  1、表是由行组成的,向某个表加锁时,需要进行两方面的检查:(1)该锁的申请是否与原有表中锁的内容相容(2)检查该锁是否与表中的每一行上的锁的内容相容; 比如:一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也会被阻塞。如果表中数据很多,逐行检查锁标志的开销将很大,系统的性能也会受到影响,为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,则为“意向锁”

   2、意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对他的上层结点加意向锁;如:对表中的任一行加锁时,必须先对他所在的表加意向锁,然后在对该行加锁,这样事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统系率大大提高

  3、共享锁(S)

   共享锁的粒度是行或者元组(多行),一个事务获得了共享锁之后,就可以对锁定范围内的数据进行读操作

  4、排它锁(X)

  排他锁的粒度是行或者元组(多行),一个事务获得排他锁之后,就可以对锁定范围内的数据执行insert/delete/update操作了

  5、意向锁

  意向锁是一种表级锁,锁的粒度是整张表,分为意向共享锁(IS)和意向排它锁(IX)

  表锁覆盖了行锁的数据,所以表锁和行锁也会产生冲突,比如:

 A、事务1:BEGIN
 B、事务1给T1加上了X锁,修改表表结构(如altertable
 C、事务2:BEGIN
 D、事务2对T1的一行加S锁或者X锁(事务2会被阻塞,等待事务1释放锁,它才能加锁成功)

事务1要操作整张表,故锁住了整张表。那么事务2就不能对该表的单条记录或者元组加X锁或者S锁,去读取或者修改记录。

为了方便地检测表级锁和行级锁之间的冲突,于是引入了意向锁。
采用了意向锁之后,上述的例子就变成:
A:事务1:BEGIN
B:事务1给T1加X锁,修改表结构
C:事务2:BEGIN
D:事务2给T1加上IX锁(事务被阻塞,等待加锁成功)
E:事务2给T1加上S锁或者X锁,成功
意向锁为了方便检测表级锁和行级锁之间的冲突,故在给一行记录加锁前,首先给该表加意向锁。也就是同时加意向锁和行级锁。
S、X锁兼容性矩阵
   S     X
S   +    -

X  -     -

+:兼容 ; -:不兼容

S、X、IS、IX锁兼容性矩阵
       IS    IX    S    X
IS    +     +     +   -
IX    +     +     -    -
S     +     -      +   -
X     -     -       -    -

+:兼容; -:不兼容
S、X、IS、IX锁兼容性矩阵为什么是这样子呢?
1、意向锁之间彼此不会冲突,因为它们都只是“有意”,而不是真干,所以是可以兼容的。在加行锁之前,会使用意向锁判断是否冲突;
2、IX和X的关系等同于X和X之间的关系,为什么呢?因为事务获得了IX锁,接下来就有权利获取X锁,这样就会出现两个事务都获取X锁的情况,这和我们已知的X锁和X锁之间互斥是矛盾的;
3、S和IS、X和IS、IX和IS也可以由此推导出来。
疑问解答:
问题:

IX 与 X冲突,那岂不是任意两个写操作,即使写不同行也会造成死锁

  1. Session A 请求 IX--成功,Session B请求 IX--成功
  2. Session A 请求 X,发现已经有其他session有IX,因此冲突
  3. 同理SessionB请求X也会是这种情况。那这row lock还有什么用?
答案:
  • IX,IS是表级锁,不会和行级的X,S锁发生冲突。只会和表级的X,S发生冲突
  • 行级别的X和S按照普通的共享、排他规则即可。所以之前的示例中第2步不会冲突,只要写操作不是同一行,就不会发生冲突。

当再向一个表添加表级X锁的时候

  • 如果没有意向锁的话,则需要遍历所有整个表判断是否有行锁的存在,以免发生冲突
  • 如果有了意向锁,只需要判断该意向锁与即将添加的表级锁是否兼容即可。因为意向锁的存在代表了,有行级锁的存在或者即将有行级锁的存在。因而无需遍历整个表,即可获取结果。



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值