MySQL数据库之mysql repeatable-read 一次利用间隙锁解决幻读案例
小标 2018-08-17 来源 : 阅读 1262 评论 0

摘要:本文主要向大家介绍了MySQL数据库之mysql repeatable-read 一次利用间隙锁解决幻读案例 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。

本文主要向大家介绍了MySQL数据库之mysql repeatable-read 一次利用间隙锁解决幻读案例 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。

repeatable-read是Mysql默认事务隔离级别!能解决脏读以及不可重复读的问题,但可能出现幻读的情况


不可重复读:在一个未提交的事务里,二次查询结果可能不相同,因为在这个事务执行过程中,外面的   事务可能对这个数据集进行了修改并提交!

幻读:一个事务在操作过程中!有别的事务对此数据集进行了修改并提交,但这些操作第一个事务读不到,等到这个事务提交的时候,便有可能引起明明插入的数据没有查询到,但却出现插入重复的错误!

不可重复读与幻读的区别:

不可重复读是能读到其它事务已经提交的数据,幻读是读不到其它事务已提交的数据!

间隙锁:间隙锁主要用来防止幻读,用在repeatable-read隔离级别下,指的是当对数据进行条件,范围检索时,对其范围内也许并存在的值进行加锁!当查询的索引含有唯一属性(唯一索引,主键索引)时,Innodb存储引擎会对next-key lock进行优化,将其降为record lock,即仅锁住索引本身,而不是范围!若是普通辅助索引,则会使用传统的next-key lock进行范围锁定!



/*

幻读案例:有个表 (id 字段为非唯一辅助索引)每次插入前需查询这字段的最大值,然后再取最大值+1插入!

事务1:                                                                                            事务2:

select max(id) from e;                                                                       insert into e values (11)

10                                                                                                       commit;

insert into e values (11)

commit;

ERROR 1062 (23000): Duplicate entry '11' for key 'id'

在上述事务1中明明查询最大值为10,但插入最大值+1的时候却报错!


解决方案:利用mysql间隙锁

事务1:                                                                              事务2:

select max(id) from e lock in share mode;  

(此时会对id为10以上的所有不存在的值加间隙锁)                   

10                                                                                       insert into e values (11);

insert into e values (11)                                                   commit;  此时提交会一处于等待状态,

commit;

 */   

                                                                                 

总结:

表a

id

3

5

6

9


在运用间隙锁的过程中,(-00 +00为负正无穷大)

如果条件为where a=5这样的条件,则间隙锁锁住的范围为(-00,3),(3,5),(5,6),(6,9),(9,+00)  

如果条件为where a>5,则间隙锁锁住的范围为(5,+00)

如果为select max(id),则锁住的范围为(max(id),+00)

另外在测试间隙锁的过程中遇到了innodb锁全表,全表所有间隙上锁的情况!这篇博文里的提到:

//blog.itpub.net/29254281/viewspace-1401413/

本文由职坐标整理并发布,希望对同学们学习MySQL有所帮助,更多内容请关注职坐标数据库MySQL数据库频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程