首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL默认隔离级别REPEATABLE-READ并没有解决幻读问题

前言MySQL默认的隔离级别是REPEATABLE-READ(可重复读)。虽然它可以提供一定程度上的数据一致性和隔离性,但并不能完全解决幻读问题。...在REPEATABLE-READ隔离级别下,只能保证在同一事务中相同的查询语句返回相同的结果,但无法防止其他事务插入新的数据,从而导致当前事务的查询结果发生变化。...幻读演示MySQL默认隔离级别REPEATABLE-READ(可重复读)会话一会话二MySQL [test]> select * from t1;+------+| id |+------+|...version();+-----------+| version() |+-----------+| 8.0.21 |+-----------+1 row in set (0.000 sec)总结在REPEATABLE-READ...FOR UPDATE语句进行的读取操作)在REPEATABLE-READ隔离级别下仍然可能遇到幻读。

28930
您找到你想要的搜索结果了吗?
是的
没有找到

事务的隔离级别

隔离级别 脏读 不可重复读 幻影读 READ-UNCOMMITTED √ √ √ READ-COMMITTED × √ √ REPEATABLE-READ × × √ SERIALIZABLE × ×...× MySQL 的默认隔离级别 MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。...| +-----------------+ 注意: InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别下,使用的是 Next-Key Lock 锁算法,因此可以避免幻读的产生...可以说,InnoDB 存储引擎默认支持的隔离级别 REPEATABLE-READ(可重读) ,已经可以完全保证事务的隔离性要求,即达到了 SQL 标准的 SERIALIZABLE(可串行化) 隔离级别。...隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但 InnoDB 存储引擎默认使用的 REPEATABLE-READ(可重读)并不会有任何性能损失

56040

技术分享 | 隔离级别:正确理解幻读

快照读和当前读混用造成的异常,不能算是幻读 网络上有一些文章说 MySQL repeatable-read 是会出现幻读的,复现用例如下: 当前读的效果就是要读取最新版本,实际上是把隔离级别从 repeatable-read...如果这个说服不了你,那我也举个简单的例子: 我们是不是得说这个例子说明了 repeatable-read 允许“P2不可重复读异常现象”?显然不能。...对于不可重复读,repeatable-read 隔离级别是明确不允许的。这就说明了当前读和快照读混用带来的异常不能称为幻读。...问题5:MySQL的 repeatable-read 隔离级别允许宽松解释的幻读吗?...所以对于 MySQL 这样基于 MVCC 实现的 RR 隔离级别,大家就当不会出现幻读,而且是符合“repeatable-read” 语义的。

70750

事务

REPEATABLE-READ(可重复读) : 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。...---- 隔离级别 脏读 不可重复读 幻读 READ-UNCOMMITTED √ √ √ READ-COMMITTED × √ √ REPEATABLE-READ × × √ SERIALIZABLE...× × × MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。...| +-----------------+ 从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。...InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的,主要有下面两种情况: 快照读 :由 MVCC 机制来保证不出现幻读。

50920

深入理解 MySQL 的 MVCC 机制

注:MySQL 的默认隔离级别为repeatable-read级别 并且在MySQL中 repeatable-read级别还可以处理幻读,这是 MySQL独有的 next-keylock 实现的。...MVCC 只在read-committed和repeatable-read 两个隔离级别下工作,其他两个隔离级别: read-uncommitted,总是读取最新的数据行,而不会读当前事务版本的数据行。...前面我们说过:MVCC 只在 read-committed 和 repeatable-read两个隔离级别下工作,而 read-committed 和 repeatable-read 的区别就在于它们生成...repeatable-read —— 在第一次查询数据时生成一个 ReadView,之后的读都复用之前的。...ReadView,而repeatable-read 只在第一次进行普通 select 操作前生成一个 ReadView,之后的查询操作都重复使用这个 ReadView 就好了。

8.8K51

MySQL数据库innodb_rollback_on_timeout参数

注: MySQL默认隔离级别为 REPEATABLE-READ,innodb_rollback_on_timeout为OFF,本文基于innodb表(支持事务)进行测试。 1....测试过程 2.1 隔离级别REPEATABLE-READ & innodb_rollback_on_timeout =OFF a) 测试过程: session A session B mysql> begin...2.3 隔离级别REPEATABLE-READ & innodb_rollback_on_timeout =ON 注:innodb_rollback_on_timeout不能在线修改,需要修改配置文件后重启生效...隔离级别 innodb_rollback_on_timeout 结果 REPEATABLE-READ OFF 超时回滚前的SQL不会自动回滚 READ-COMMITTED OFF 超时回滚前的SQL不会自动回滚...表观察事务情况,在不同的版本中事务情况不一样.例如,隔离级别REPEATABLE-READ & innodb_rollback_on_timeout=on的情况下,MySQL5.6 中整个事务回滚后会自动创建一个事务

2.7K11

事务的隔离级别详解

REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。...---- 隔离级别 脏读 不可重复读 幻读 READ-UNCOMMITTED √ √ √ READ-COMMITTED × √ √ REPEATABLE-READ × × √ SERIALIZABLE...MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。...| +-----------------+ MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。...因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED(读取提交内容) ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ

34120

通俗易通的MySQL面试题总结(上)

REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。...image.png MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。...| +-----------------+ 这里需要注意的是:与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key...所以说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的SERIALIZABLE(可串行化)隔离级别。...因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但是你要知道的是InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读

31640

MySQL数据库事务隔离级别

mysql》一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ..., SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = REPEATABLE-READ 这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别...REPEATABLE-READ(可重读) 1)A设置事务隔离级别,进入事务后查询一次 2)B开始事务,并对user表进行修改 3)A查看user表数据,数据未发生改变 4)B提交事务 5)A再进行一次查询...结果已经更新 7)A重新开始事务,并对user表进行修改 8)B表重新开始事务,并对user表进行修改,修改被挂起,直到超时,对另一条记录修改却成功,说明A对表进行修改时加了行共享锁(可以select) REPEATABLE-READ

2.4K71

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券