MySQL中的事务隔离级别

 

事务隔离级别

 未提交读(Read uncommitted)是最低的隔离级别。通过名字我们就可以知道,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。

提交读(Read committed)也可以翻译成读已提交,通过名字也可以分析出,在一个事务修改数据过程中,如果事务还没提交,其他事务不能读该数据。所以,这种隔离级别是可以避免脏读的发生的。

可重复读(Repeatable reads),由于提交读隔离级别会产生不可重复读的读现象。所以,比提交读更高一个级别的隔离级别就可以解决不可重复读的问题。这种隔离级别就叫可重复读。但是这种隔离级别没办法彻底解决幻读。

可串行化(Serializable)是最高的隔离级别,前面提到的所有的隔离级别都无法解决的幻读,在可串行化的隔离级别中可以解决。

InnoDB如何解决脏读、不可重复读和幻读的?

在Innodb中,通过MVCC解决脏读和不可重复读,通过MVCC+间隙锁解决幻读的。

脏读的解决。脏读指一个事务可以读取另一个事务未提交的数据,导致数据不一致。在读已提交(Read Committed)隔离级别下,事务只能读取到其他事务已经提交的数据版本。因此,如果一个事务在读取数据时,另一个事务已经修改了这些数据但尚未提交,那么读取事务将不会看到这些未提交的更改。

当事务在“读已提交”隔离级别下执行读取操作时,InnoDB获取当前最新的全局事务ID,这个ID表示在当前时刻所有已提交事务的最新状态。InnoDB会检查每个数据行的版本,如果该版本是由一个小于或等于当前事务ID的事务修改的,并且该事务已提交,则这个版本是可见的。这保证了事务只能看到在它开始之前已经提交的数据版本。

不可重读的解决。不可重复读指一个事务读取同一行数据两次,但是在两次读取之间另一个事务修改了该行数据,导致两次读取的结果不同。InnoDB 通过使用 MVCC 来解决不可重复读的问题。在RR这种隔离级别下,当我们使用快照读进行数据读取的时候,只会在第一次读取的时候生成一个Read View,后续的所有快照读都是用的同一个快照,所以就不会发生不可重复读的问题了。

幻读的解决。InnoDB的RR级别中,基于MVCC+间隙锁,是在某种程度上是可以避免幻读的发生的,但是没有办法完全避免,当一个事务中发生当前读的时候,会导致幻读的发生。
 

相关推荐

  1. MySQL事务隔离级别

    2024-05-13 18:46:02       11 阅读
  2. MySQL事务隔离级别

    2024-05-13 18:46:02       37 阅读
  3. MySQL 事务隔离级别

    2024-05-13 18:46:02       8 阅读
  4. mysql事务隔离级别和JDBC

    2024-05-13 18:46:02       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 18:46:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 18:46:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 18:46:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 18:46:02       18 阅读

热门阅读

  1. 每个工作室都需要的10种插件类型

    2024-05-13 18:46:02       13 阅读
  2. matlab实现K均值聚类

    2024-05-13 18:46:02       11 阅读
  3. 图像下载的新趋势:Kotlin技术探索与实践

    2024-05-13 18:46:02       12 阅读
  4. SQL优化

    SQL优化

    2024-05-13 18:46:02      9 阅读