MySQL进阶(二)-事务篇

本文最后更新于:2024年4月22日 下午

MySQL事务回顾,事务底层实现原理,MVCC是如何工作的,Undo日志

事务概念

事务指的是逻辑上的一组操作,这组操作的组成单元要么全都成功,要么全都失败,本质上是个并发编程问题

事务四大特性ACID

  • 原子性**A**tomicity

  • 一致性**C**onsistency

  • 隔离性**I**solation

  • 持久性**D**urability

事务并发问题

  • 脏读:一个事务读到了另一个事务**未提交**的数据
  • 不可重复读:一个事务读到另一个事务**已经Update**的数据。引发事务中的多次查询结果不一致
  • 幻读:一个事务读到另一个事务**已经Insert**的数据。导致事务中多次查询的结果不一致

事务隔离级别

读未提交RU:Read Uncommitted,一个事务读到另一个事务没有提交的数据

  • 存在:3个问题:脏读、不可重复读、幻读

读已提交RC:Read Committed,一个事务读到另一个事务已经提交的数据

  • 存在:2个问题:不可重复读、幻读

可重复读RR:Repeatable Read,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交

  • 存在:1个问题:幻读

串行化读:Serializable,同时只能执行一个事务,相当于事务中的单线程

事务底层原理MVCC

MVCC全称叫多版本并发控制,是RDBMS常用的一种并发控制方法,用来对数据库数据进行并发访问,实现事务

读不加锁,读写不冲突

实现原理

数据快照,不同十五访问数据快照中不同版本的数据

InnoDB下的表有默认字段可见字段,默认字段是实现MVCC的关键,默认字段是隐藏的列。默认字段最关键的两个列,一个保存了行的事务ID,一个保存了行的回滚指针。每开始新的事务,都会自动递增产生一个新的事务id。事务开始后,生成当前事务影响行的ReadView。当查询时,需要用当前查询的事务id与ReadView确定要查询的数据版本。

Undo日志

  • 在对数据修改时,InnoDB会产生一定量的Undo日志,如果事务执行失败Rollback了,则利用Undo日志回滚到历史版本

  • Undo日志还可以解决丢失更新问题

  • 存储位置:系统表空间内的回滚段中

Undo日志分类

Insert Undo日志:是在Insert操作中产生的Undo日志

Update Undo日志:是Update或Delete 操作中产生的Undo日志

ReadView

ReadView是张存储事务id的表,主要包含当前系统中有哪些活跃的读写事务,把它们的事务id放到一个列表中。结合Undo日志的默认字段【事务trx_id】来控制那个版本的Undo日志可被其他事务看见。

m_ids:表示在生成ReadView时,当前系统中活跃的读写事务id列表

m_low_limit_id:事务id下限,表示当前系统中活跃的读写事务中最小的事务id,m_ids事务列表中的最小事务id

m_up_limit_id:事务id上限,表示生成ReadView时,系统中应该分配给下一个事务的id值

m_creator_trx_id:表示生成该ReadView的事务的事务id

事务底层原理(快照读与当前读)

快照读:读取的是记录的可见版本 (有可能是历史版本),不用加锁。

当前读:读取的是记录的最新版本,并且当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录


MySQL进阶(二)-事务篇
https://hyq965672903.gitee.io/posts/dce87f52.html
作者
灼华
发布于
2023年4月2日
许可协议