可重复读 读提交

READ COMMITTED

一个事务的修改在他提交之前的所有修改,对其他事务都是不可见的。其他事务能读到已提交的修改变化。在很多场景下这种逻辑是可以接受的。

InnoDB在 READ COMMITTED,使用排它锁,读取数据不加锁而是使用了MVCC机制。或者换句话说他采用了读写分离机制。

但是该级别会产生不可重读以及幻读问题。

什么是不可重读?

在一个事务内多次读取的结果不一样。

为什么会产生不可重复读?

这跟 READ COMMITTED 级别下的MVCC机制有关系,在该隔离级别下每次 select的时候新生成一个版本号,所以每次select的时候读的不是一个副本而是不同的副本。

在每次select之间有其他事务更新了我们读取的数据并提交了,那就出现了不可重复读

REPEATABLE READ(Mysql默认隔离级别)

在一个事务内的多次读取的结果是一样的。这种级别下可以避免,脏读,不可重复读等查询问题。mysql 有两种机制可以达到这种隔离级别的效果,分别是采用读写锁以及MVCC。

采用读写锁实现:

 

为什么能可重复读?只要没释放读锁,在次读的时候还是可以读到第一次读的数据。

优点:实现起来简单

缺点:无法做到读写并行

采用MVCC实现:

 

为什么能可重复读?因为多次读取只生成一个版本,读到的自然是相同数据。

优点:读写并行

缺点:实现的复杂度高

但是在该隔离级别下仍会存在幻读的问题,关于幻读的解决我打算另开一篇来介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的不可复读和幻是在不同的事务隔离级别下出现的问题。不可复读是指在同一个事务中,多次取同一行数据时,前后取的结果不一致。而幻则是指在同一个事务中,多次执行相同的查询语句时,返回的结果集不一致,可能会出现新增或删除的数据。 在MySQL中,不可复读和幻的出现与事务隔离级别有关。MySQL有四个事务隔离级别,分别是提交(READ UNCOMMITTED)、提交(READ COMMITTED)、可复读(REPEATABLE READ)和序列化(SERIALIZABLE)。 在提交的隔离级别下,会出现不可复读和幻的问题。因为提交允许一个事务可以取到另一个未提交事务中的数据,这就可能导致取到的数据在事务中发生了变化。 在提交的隔离级别下,不会出现不可复读的问题,因为该级别只允许取到已经提交的数据。但是在提交的隔离级别下,仍然会出现幻的问题。因为幻是指某个事务在执行相同的查询语句时,由于其他事务的新增或删除操作,导致返回的结果集发生了变化。 可复读是MySQL的默认事务隔离级别,它解决了不可复读的问题。在可复读的隔离级别下,事务执行期间,取的数据集会保持一致,不会受到其他事务的修改影响。但是可复读隔离级别下仍然会出现幻的问题,因为幻是由于其他事务的插入操作导致的。 为了解决幻的问题,可以使用序列化的隔离级别。在序列化的隔离级别下,MySQL会对所有并发的事务进行串行化执行,确保每个事务之间是完全隔离的,不会出现不可复读和幻的问题。 综上所述,MySQL的不可复读和幻问题是与事务隔离级别相关的。在提交的隔离级别下,会出现不可复读和幻问题;在提交的隔离级别下,不会出现不可复读问题但仍然会出现幻问题;在可复读的隔离级别下,解决了不可复读的问题但仍然会出现幻问题;而使用序列化的隔离级别可以解决不可复读和幻的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值