欢迎光临
我们一直在努力

MySQL事务隔离级别

文章目录

  • 前言
  • 一、事务特性
  • 二、事务并发引起的问题
    • 1.脏读
    • 2.不可重复读
    • 3.幻读
  • 三、Mysql四种隔离级别
    • 1.未提交读
    • 2.已提交读
    • 3.可重复读
    • 4.串行化
  • 四、MVCC、版本链、ReadView原理
    • 1.MVCC
    • 2.版本链
    • ReadView
    • 已提交读隔离级别实现原理
    • 可重复读隔离级别实现原理
      • InnoDB 如何解决幻读?
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:


提示:以下是本篇文章正文内容,下面案例可供参考

一、事务特性

事务特性 ACID: 原子性:最小的执行单位,要么同时成功,要么同时失败 一致性:数据一致性 隔离型:多个事务执行时,彼此隔离,否则有事务并发问题 持久性:数据库永久保存

二、事务并发引起的问题

1.脏读

事务B读取到事务A未提交的脏数据

2.不可重复读

在同一条数据中,事务B前后两次读取的值不一致,通常是数据修改

3.幻读

在同一范围中,事务B前后两次读取的行数不一致,通常是数据新增删除

补充:幻读是指两次相同的查询(查询类型相同)返回不同行集。这里两次查询类型不同(一次快照读,一次当前读),因此不属于典型的幻读

严重程度排名:脏读>不可重复读>幻读

三、Mysql四种隔离级别

1.未提交读

可能有脏读、不可重复读、幻读问题

2.已提交读

可能有不可重复读、幻读问题

3.可重复读

InnoDB 默认隔离级别。通过 MVCC 避免快照读的幻读,通过间隙锁避免当前读的幻读,因此在 InnoDB 中实际上完全解决了幻读问题(但标准 SQL 定义中仍允许幻读,需要说明这一区别)。

4.串行化

不存在事务隔离级别

四、MVCC、版本链、ReadView原理

1.MVCC

MVCC是多版本并发控制,是一种并发控制的概念/思想,在 InnoDB 中,这个思想是通过具体的机制实现的,就是常说的版本链和ReadView。

2.版本链

undo日志:每次操作数据会生成一条undo日志 关键信息:操作记录、事务ID、回滚指针 在这里插入图片描述

ReadView

读视图,关键信息如下: m_ids 活跃的事务ids min_trx_id 最小的事务id max_trx_id 最大的事务id creator_trx_id 生成事务的id

版本链+ReadView,解决脏读、不可重复读问题

已提交读隔离级别实现原理

使用已提交读隔离级别,在每次查询之前都会生成一个ReadView,解决脏读,但可能导致不可重复读和幻读

可重复读隔离级别实现原理

使用可重复读读隔离级别,在第一次查询之前都会生成一个ReadView,解决不可重复读问题,但 MVCC 其实也同时解决了快照读下的幻读

InnoDB 如何解决幻读?

InnoDB 的查询分为两类:

  • 快照读:普通 SELECT,利用 MVCC 和 ReadView,读取数据的快照版本,复用首次生成的 ReadView,后续插入的数据不可见,保证多次读取结果一致,彻底避免了幻读。
  • 当前读:SELECT … FOR UPDATE / UPDATE / DELETE,它们读取的是数据的最新版本,并且会对读取的数据加锁。,通过间隙锁锁定范围,防止其他事务插入新数据,从而避免幻读。 因此,在 InnoDB 可重复读隔离级别下,通过 MVCC + 间隙锁 完全解决了幻读问题。

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了Mysql事务隔离级别的使用,欢迎评论区一起交流。

赞(0)
未经允许不得转载:171主机测评 » MySQL事务隔离级别
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址