`
MauerSu
  • 浏览: 496269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

mysql repeatable-read 一次利用间隙锁解决幻读案例

 
阅读更多
源:http://fucheng.blog.51cto.com/2404495/1619359
评:
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锁全表,全表所有间隙上锁的情况!这篇博文里的提到:
http://blog.itpub.net/29254281/viewspace-1401413/


本文出自 “夫臣” 博客,请务必保留此出处http://fucheng.blog.51cto.com/2404495/1619359
分享到:
评论

相关推荐

    浅析MYSQL REPEATABLE-READ隔离级别

    REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变。这种隔离级别可能导致读到的东西是已经修改过的。 比如: 回话一中读取一个字段一行a=1 在回话二里这个字段该行...

    MySQL数据库事务隔离级别介绍(Transaction Isolation Level)

    数据库隔离级别有四种,应用《高性能mysql》一书中的说明: ...这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别 2.对当前session修改,在登录mysql客户端后,执行命令: 要记住mysql有一个autoc

    MySQL数据库事务隔离级别

    修改mysql.ini配置文件,在最后加上#可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE.2[mysqld]3transaction-isolation=REPEATABLE-READ这里全局默认是REPEATABLE-READ,其实MySQL本来...

    MySQL 四种事务隔离级别详解及对比

    MySQL 四种事务隔离级别详解及对比 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE...transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE} 用户可以用SE

    MySQL中InnoDB锁的介绍及用途

    可重复读(repeatable-read) 不可能 不可能 InnoDB不可能 串行化(serializable) 不可能 不可能 不可能 隔离级别到底如何实现? 二、锁的介绍 1、表锁、行锁 通过锁来管理不同事务对共享资源的并发访问 表锁...

    MySql自动备份,自动压缩,自动删除历史

    rem 采用--single-transaction保证备份的一致性,实际上设定本次会话的隔离级别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到其他会话已经提交了的数据。 rem 压缩备份的数据库文件,windows自带压缩到...

    Mysql innodb 存储引擎全揭秘

    同时使用一种 -- next-key locking 的锁策略来避免幻读现象的产生,还提供了插入缓冲(insert buffer) 二次写(double write) 自适应哈希索引,预读(read ahead)等高性能和高可用的功能。对于表中的数据innodb...

    java收银系统源码-Build-Repeatable-Infrastructure-using-Terraform-and-Ansible:

    java收银系统源码在 AWS 上使用 Terraform 和 Ansible 构建可重复的基础设施 许多公司仍在为基本 IT 运营而苦苦挣扎。...他们花费太多时间灭火并手动构建、配置和维护基础...一次性基础设施不是另一种流行的汤,在您知道

    mysql数据库my.cnf配置文件

    # 如没有指定,MySQL默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED log_bin = mysql-bin binlog_format = mixed expire_logs_days = 30 #超过30天的binlog删除 slow_query_log = 1 long_query_time = ...

    mysql面试题,MySQL是一种关系型数据库管理系统,由Oracle公司开发

    答:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)、串行izable(SERIALIZABLE) 6. MySQL的存储引擎有哪些? 答:InnoDB、MyISAM、Archive等 7. InnoDB的特点有哪些? 答:支持...

    解读MySQL事务的隔离级别和日志登记模式选择技巧

    MySQL的四种事务隔离级别:Read-uncommitted、Read-committed、Repeatable-read、Seriailizable,相信大家都清楚各自异同,不清楚的朋友可以查看另外一篇技术文章:MySQL_InnoDB之事务与锁详解。但是对于第二类、第...

    java-数据库系统原理.docx

    并发访问问题 事务隔离级别 丢失修改 MySQL 所有事务隔离级别在数据库层面上均可避免 脏读 READ-COMMITTED 事务隔离级别以上可避免 不可重复读 REPEATABLE-READ 事务隔离级别以上可避免 幻读 SERIALIZABLE 事务隔离...

    MySQL数据库:事务隔离级别.pptx

    MySQL提供了下面4种隔离级:序列化(SERIALIZABLE)、可重复读(REPEATABLE READ)、提交读(READ COMMITTED)、未提交读(READ UNCOMMITTED)。 事务隔离级别 语法格式: SET [GLOBAL | SESSION] TRANSACTION ...

    Jonny023#Study#事务隔离级别1

    事务:保证数据一致性,要么执行,要么不执行,mysql默认事务隔离级别:REPEATABLE-READ开启事务三个问题不可重复读:指在一个事务中,对同一数据进行

    repeatable-workflows-docker-ipython:如何使用 Docker 和 IPython Notebooks 实现可重复的工作流

    使用 Docker 和 IPython 创建可重复的工作流

    MySQL数据库事务隔离级别详解

    数据库事务隔离级别 ...这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。 √: 可能出现 ×: 不会出现 事务级别 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed

    程序员5个刷题网站-InterviewFAQ-database:总结数据库部分的面试常见问题

    repeatable-read:可重读(幻读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。 不过理论上会导致幻读(Phantom Read)。 幻读指当用户读取某一范围的数据行时,...

Global site tag (gtag.js) - Google Analytics