HTML5技术

mysql的并发处理机制_下篇 - 苏家小萝卜(2)

字号+ 作者:H5之家 来源:H5之家 2017-10-24 09:01 我要评论( )

RC是读已提交,不添加 LOCK IN SHARE MODE 跟 FOR UPDATE 的 SELECT 语句,均为 快照读,不加锁,同个事务内读取同一个版本的数据,可能非最新数据,但是不存在脏读、不可重复读及幻读情况。 所有UPDATE、DELETE、I

     RC是读已提交,不添加 LOCK IN SHARE MODE 跟 FOR UPDATE 的 SELECT 语句,均为 快照读,不加锁,同个事务内读取同一个版本的数据,可能非最新数据,但是不存在脏读、不可重复读及幻读情况。

     所有UPDATE、DELETE、INSERT获取当前读记录,加锁。

 

     下表中,黄绿色 字体 是RC与RU隔离级别不同的地方,仔细阅读分析结果可以知道,在 RU 跟 RC 间,最大的区别在于 SELECT 的查询模式,RU 为 读未提交,而 RC 为快照读。UPATE/DELETE/INSERT的加锁模式类同。

  表格

             SQL

select * from tbname

where age/id ...

update tbname set name=...

where id = 4

update tbname set name=...

where age = 21

update tbname set name=...

where age between 5 and 15

tb_no_index

快照读,不加锁

读取的数据不一定是最新版本,但是事务内的所有查询读取数据都是同一版本的行数据,不存在脏读、不可重复读及幻读的情况

当前读,根据主键修改数据

tbname 加意向表锁 IX

id=4 加 行锁 X

 

 

表格的age列无索引,所以update过程中,全表加X锁

支持semi-constent-read,如果有其他update语句修改其他行不堵塞,但是不支持 select ... for update

同左

tb_index

表格的age列有索引,update过程中

tb_index 加 表格意向锁 IX

age索引上面,age=21 行添加行锁 X

再在主键上,给id=3 这一行数据,添加行数 X

 

表格的age列有索引,update过程涉及age=7,9 两行数据

tb_index 加表格意向锁 IX

age索引上面,age=7,age=9 行添加行锁 X

再在主键上,给id=2,id=5 这一行数据,添加行数 X

 

 

tb_unique_index

同上

同上

 

 

2.3 Read Repeatable

所有事务隔离级别设置: set session transaction isolation level repeatable read ;

 

      RR隔离级别中,SELECT操作支持快照读,所有的UPDATE/DELETE/INSERT加锁,锁类型会新增一个GAP LOCK。

   表格     SQL

select * from tbname

where age/id ...

update tbname set name=...

where id = 4

update tbname set name=...

where age = 21

update tbname set name=...

where age between 5 and 15

tb_no_index

快照读,不加锁

读取的数据不一定是最新版本,但是事务内的所有查询读取数据都是同一版本的行数据,不存在脏读、不可重复读及幻读的情况

当前读,根据主键修改数据

tbname 加意向表锁 IX

id=4 加 行锁 X

 

 

表格的age列无索引,所以update过程中

全表加X锁,期间全表堵塞UPDATE\DELETE\INSERT

同左

tb_index

表格的age列有索引,update过程中

tb_index 加 表格意向锁 IX

age索引上面,age=21 行添加行锁 X

再在主键上,给id=3 这一行数据,添加行数 X

 

你以为结束了!并没有,这里有趣了!

还会添加两个gap lock ((9,2) ,(21,3)),((21,3), (21,25))

 

这里我们单独拎出小表格来分析。

 

表格的age列有索引,update过程涉及age=7,9 两行数据

tb_index 加表格意向锁 IX

age索引上面,age=7,age=9 行添加行锁 X

再在主键上,给id=2,id=5 这一行数据,添加行数 X

同时会在索引 age的值上添加 3个 gap lock,分别为 

((4,4),(7,5))、((7,5),(9,2))、((9,2),(21,3))

 

 

tb_unique_index

以为跟上面的加锁范围一样,no no no

唯一索引列上 每一个age都是唯一的,也就是age=21只有一个,不会再INSERT一个新的 age =21进来,故在这里不需要加gap lock,加锁情况如下:

tb_index 加 表格意向锁 IX

age=21 行添加行锁 X 

age索引上面,age=21 行添加行锁 X

再在主键上,给id=3 这一行数据,添加行数 X

表格的age列有索引,update过程涉及age=7,9 两行数据

tb_index 加表格意向锁 IX

age索引上面,age=7,age=9 行添加行锁 X

再在主键上,给id=2,id=5 这一行数据,添加行数 X

同时会在索引 age的值上添加 3个 gap lock,分别为 

((4,4),(7,5))、((7,5),(9,2))、((9,2),(21,3))

但是,范围查询添加到gap lock在其他情况下跟非唯一索引会有一些差别,可以看下表的例子。

 

这里做亮点补充说明:

 

2.3.1 RR下的非唯一索引加锁情况

      update tbname set name=...  where age = 21

      

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • bootstrap Table 服务端处理分页 后台是.net - tzzf

    bootstrap Table 服务端处理分页 后台是.net - tzzf

    2017-10-19 08:03

  • Entity Framework Code First实现乐观并发 - 东城慕水

    Entity Framework Code First实现乐观并发 - 东城慕水

    2017-10-12 11:00

  • Go语言学习笔记(八)golang 操作 Redis Mysql RabbitMQ - 索宁

    Go语言学习笔记(八)golang 操作 Redis Mysql RabbitMQ - 索宁

    2017-08-24 09:03

  • EntityFramework Core问题处理集锦(一) - Jeffcky

    EntityFramework Core问题处理集锦(一) - Jeffcky

    2017-08-07 11:00

网友点评
i