`
day6
  • 浏览: 4503 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
repeatable-read是Mysql默认事务隔离级别!能解决脏读以及不可重复读的问题,但可能出现幻读的情况



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

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

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

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

间隙锁:间隙锁主要用来防止幻读,用在repeatable-read隔离级别下,指的是当对数据进行条件,范围检索时,对其范围内也许并存在的值进行加锁!

比如where id <8 lock in share mode,则对8以下的值都加间隙锁,

select max(id) ........lock in share mode,则会对max(id)以上的并不存在值加间隙锁! 

select * from e where id=20 lock in share mode 则只会对id=20加锁!(此时可能只是普通的共享锁了)

select * from e lock in share mode; 则对整个e加上间隙表锁!





幻读案例:有个表(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;

                                                                                          



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

相关推荐

    间隙锁原理

    java 间隙锁实现原理,包含一条sql语句的加锁流程,mysql底层的存储

    一不小心,间隙锁引发的报警现场

    今天来分享一下我在线上环境遇到的有关MySQL间隙锁的死锁问题。本文将讲述从发现问题到解决问题的全过程,并给出一些个人建议,其中使用的数据将做脱敏处理,但不影响食用口感。 发现问题 运维同学发现有大量的MySQL...

    MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解

    本文主要讨论了MySQL中的五种锁:表锁、行锁、共享锁、排它锁和间隙锁。 1. 表锁:表锁是MySQL中最基础的锁类型,主要在MyISAM存储引擎中使用。表锁分为两种模式:读锁(Table Read Lock)和写锁(Table Write Lock...

    MySQL中InnoDB的间隙锁问题

    综上所述,理解InnoDB的间隙锁以及其带来的死锁问题对于优化MySQL数据库性能至关重要。合理规划事务执行逻辑、选择合适的隔离级别、监控锁争用情况是解决死锁问题、提高数据库性能的有效措施。在实际应用中,应该...

    MySQL的锁机制解析

    - **Next-Key Locks(行锁+间隙锁)**:防止幻读,锁定当前行及其前开区间,防止插入在已锁定行前面的新行。 - **记录锁(Record Locks)**:只锁定特定的行。 - **间隙锁(Gap Locks)**:不锁定具体记录,而是...

    MySQL高级 锁机制

    此外,还存在一种特殊类型的行锁——间隙锁(Gap Lock),它不仅锁定特定的行,还锁定行之间的间隙,防止其他用户插入数据,从而避免幻读问题。然而,间隙锁可能导致不必要的阻塞。例如,如果一个事务在某范围内锁定...

    MySQL:锁机制.pdf

    在MySQL中,锁机制是保障数据操作安全的重要组成部分,其主要分为表锁、行锁和间隙锁。本知识点详细解读了MySQL锁机制的定义、分类、特点以及具体的应用案例。 1. 锁的定义和分类 在数据库系统中,锁是用来控制多...

    MYSQL锁机制全揭秘

    InnoDB的行级锁类型包括记录锁、间隙锁和临键锁等,主要用来减少锁争用,提高并发性。InnoDB支持多版本并发控制(MVCC),可以实现非阻塞的读操作。 在解决MySQL锁问题时,需要注意选择合适的事务隔离级别,因为...

    mysql insert锁机制1

    MySQL的Insert锁机制是数据库管理系统中确保数据一致性和并发控制的重要组成部分。在MySQL的InnoDB存储引擎中,插入操作不仅涉及到行级锁,还可能涉及Gap锁和Next-Key Locks,这些锁机制的设计是为了防止幻读...

    2021年MySQL高级教程视频.rar

    21.MySQL高级锁InnoDB行锁间隙锁危害.avi 22.MySQL高级锁InnoDB行锁争用情况查看.avi 23.MySQL高级锁InnoDB行锁总结.avi 24.MySQL高级SQL技巧SQL执行顺序及正则表达式.avi 25.MySQL高级SQL技巧数字函数与字符串函数....

    MySQL锁的详细介绍

    * Next-key Lock 锁:记录锁和间隙锁组合,同时锁住数据,并且锁住数据前后范围。 三、悲观锁 悲观锁(Pessimistic Locking)是指在数据处理过程,将数据处于锁定状态,一般使用数据库的锁机制实现。 在 MySQL 中...

    行业-59 对MySQL锁机制再深入一步,共享锁和独占锁到底是什么?l.rar

    此外,间隙锁(Next-Key Locks)是InnoDB存储引擎中的一种扩展锁机制,它不仅锁定特定的行,还锁定索引记录之间的间隙,防止其他事务插入数据导致幻读现象。间隙锁在某些场景下可以提高并发性,但也可能增加锁的竞争...

    【课堂笔记】MySQL事务与锁详解.pdf

    - 临键锁(Next-Key Locks):是记录锁与间隙锁的组合,封锁范围包括索引记录及索引记录之前的间隙。 5. 前缀索引的创建与使用: 前缀索引是一种特殊类型的索引,它使用字段的部分内容(前缀)而非全部内容来创建...

    mysql高级视频教程百度云(2019).txt

    60.MySQL高级_间隙锁危害.avi 59.MySQL高级_索引失效行锁变表锁.avi 58.MySQL高级_行锁演示答疑补充.avi 57.MySQL高级_行锁案例讲解.avi 56.MySQL高级_行锁理论.avi 55.MySQL高级_读锁案例讲解2.avi 54...

    MySQL锁详细介绍

    行级锁包括行锁(Record Locks)、间隙锁(Gap Locks)和临键锁(Next-Key Locks)。 7. **页级锁**:介于表级锁和行级锁之间,锁定的数据量比行级锁多,但比表级锁少,某些存储引擎支持页级锁。 在实际应用中,...

Global site tag (gtag.js) - Google Analytics