加载中…
个人资料
你若盛开_蝴蝶自来
你若盛开_蝴蝶自来
  • 博客等级:
  • 博客积分:0
  • 博客访问:110,598
  • 关注人气:6
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

MySQL 共享锁、排他锁、意向锁解析

(2015-04-19 17:00:04)
分类: MySQL
共享锁
共享锁(S),是Share的缩写,共享锁的锁粒度是行或者元组(多行)。一个事务获得了共享锁之后,就可以对锁定范围内的数据进行读操作。

排他锁
排他锁(X),是eXclusive的缩写,排他锁的粒度和共享锁一样,也是行或者元组。一个事务获得排他锁之后,就可以对锁定范围内的数据执行insert/delete/update操作。

意向锁
意向锁是一种表级锁,锁的粒度是整张表。分为意向共享锁(IS)和意向排他锁(IX)。
那么意向锁是从何而来的呢?
因为表锁覆盖了行锁的数据,所以表锁和行锁也会产成冲突。例如:
A、事务1:BEGIN
B、事务1给T1加上了X锁,修改表表结构(如alter table
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也可以由此推导出来。







0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有