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
事务底层原理(快照读与当前读)
快照读:读取的是记录的可见版本 (有可能是历史版本),不用加锁。
当前读:读取的是记录的最新版本,并且当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录