欢迎光临
我们一直在努力

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

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

共享锁

共享锁(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) 打赏
未经允许不得转载:乌西塔 » MySQL 共享锁、排他锁、意向锁解析

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

微信扫一扫打赏