`
MauerSu
  • 浏览: 514451 次
  • 性别: 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数据库-事务、锁及SQL优化

    - **可重复读(REPEATABLE-READ)**:在事务内多次读取同一数据始终一致,但可能产生幻读。 - **序列化(SERIALIZABLE)**:最严格的隔离级别,通过锁定事务期间的所有读取行,防止脏读、不可重复读和幻读,但可能降低...

    mysql-connector-java-8.0.2下载

    6. **事务处理**:支持各种事务隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。 7. **多版本并发控制**(MVCC):MySQL 8.0引入...

    mysql-connector-java-8.0.21

    6. **事务处理**:支持多种事务隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。 7. **批处理操作**:允许一次发送多条SQL语句,...

    mysql-connector-java-5.1.6-bin.jar

    3. **事务支持**:支持JDBC的事务处理,包括读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)等隔离级别。 4. **结果集处理**:提供了处理查询结果的方法,可以将结果集转换为Java对象,如`ResultSet`。 ...

    MySQL可重复读级别能够解决幻读吗

    MySQL的可重复读(Repeatable Read)隔离级别是其事务管理机制的一部分,旨在解决数据库并发操作中的一些问题,如脏读、不可重复读和幻读。然而,标题中提出的问题在于,可重复读隔离级别是否能完全防止幻读。在这个...

    mysql-5.6.37-winx64-精简包

    6. **交易隔离级别**:在MySQL中,有四种交易隔离级别可供选择:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。根据描述,此精简包已经预设为...

    mysql-5.6.17-win32.zip

    2. **InnoDB增强**:默认事务隔离级别提升到Repeatable Read,提供更好的并发控制;支持自适应hash索引,能动态调整以优化查询性能。 3. **分区功能**:增强了对分区表的支持,允许更大规模的数据管理和分析。 4. ...

    mysql-一些常见的mysql死锁案例-笔记记录.zip

    MySQL支持四种隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。在可重复读隔离级别下,MySQL使用Next-Key Locks(包括行锁和间隙锁)...

    mysql-connector-java-8.0.16.zip

    7. **事务处理**:支持多种事务隔离级别,如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE,满足不同应用场景的需求。 8. **结果集缓存**:通过 Result Set Caching,可以将查询结果缓存...

    mysql-connector-java-5.1.39.jar资源下载

    6. 全面的事务支持:包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)四种隔离级别。 7. 集成到应用服务器:可以无缝集成到诸如 Tomcat、JBoss...

    MySQL的锁机制解析

    - **读锁(Read Locks, 或 Shared Locks)**:允许多个事务同时读取同一表,但阻止其他事务写入。 - **写锁(Write Locks, 或 Exclusive Locks)**:只允许一个事务对表进行写操作,其他事务无法读取或写入。 2. ...

    mysql-5.6.45-winx64.zip

    5. 交易隔离级别:支持可重复读(Repeatable Read)隔离级别,防止幻读问题,提高了并发事务处理的安全性。 二、Windows下的MySQL 5.6.45安装 1. 下载与解压:首先,从官方网站下载“mysql-5.6.45-winx64.zip”...

    详解MySQL是如何解决幻读的

    在可重复读(Repeatable Read,RR)隔离级别下,InnoDB默认使用MVCC和Next-Key 锁来防止幻读。然而,有一种观点认为,在某些特定情况下,如引用一中提到的,如果事务T1先执行SELECT,然后另一个事务T2插入数据并提交...

    mysql-connector-java-5.1.34

    7. **事务特性**:支持各种事务隔离级别,如READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。 8. **异常处理**:封装了MySQL的错误代码和消息,转换为Java的SQLException。 9. **连接优化**:...

    MySQL-并发事务问题及解决方案.docx

    在RR级别下,MySQL使用Next-Key Locks(包括行锁和间隙锁)来阻止幻读,确保事务内部的查询结果不会因为其他事务的INSERT操作而改变。 - 串行化是最高的隔离级别,通过锁定事务期间的所有读写操作,确保无脏读、不可...

    mysql insert锁机制1

    在MySQL的InnoDB存储引擎中,插入操作不仅涉及到行级锁,还可能涉及Gap锁和Next-Key Locks,这些锁机制的设计是为了防止幻读(Phantom Read)和其他并发问题。 1. 数据库版本:文中提到的是MySQL 5.6.27。不同版本...

    mysql-connector-java-8.0.21.zip

    7. **事务支持**:支持ACID(原子性、一致性、隔离性、持久性)特性,提供不同级别的事务隔离,如READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。 8. **多语种支持**:支持多种字符集,包括...

    一次MYSQL死锁分析案例1

    - **隔离级别**: 此案例中提到的隔离级别是可重复读(Repeatable Read),这是InnoDB存储引擎的默认隔离级别,它能防止幻读现象,但可能会导致死锁。 - **索引**: 死锁涉及到的是`order_pay_status`表的主键索引。 ...

Global site tag (gtag.js) - Google Analytics