Mysql--事务
- 目的
- 保证数据库安全稳定运行的技术
四大特性ACID(原子性、一致性、隔离性、持久性)
-
原子性
- 要么都成功, 要么都失败
- 实现机制是undo log
-
⼀致性
- 操作前后, 系统稳定,数据⼀致
- 原⼦子性不代表⼀致性
- 脏读/不可重复读/幻读
- 解决办法 调整事务隔离级别
- 提交事务后, 只有⼀半操作持久化成功
- 解决办法redo log
- 脏读/不可重复读/幻读
-
隔离性
- 每个事务是独立的,相互不会影响
- 实现机制 多版本并发控制+锁
-
持久性
- 保证事务的执行结果⼀定能在数据库中同步完成, 无论数据库所在硬件是否瘫痪
- 实现机制 redo log
原⼦子性 持久性 隔离性 实现了了⼀一致性
MVCC 多版本并发控制
- 简单来说就是对数据做了多版本处理
- 事务隔离级别中的RC和RR就是MVCC实现的
- RR 可重复读级别
- 快照读
select * from xx
; # 在事务中无论读多少次都和第⼀次读的结果⼀样 - 当前读
select * from xx lock in share mode
;select * from xx for update insert update delete
- 快照读
- RC 读已提交级别
- 仍然有快照读, 事务提交成功的数据可以读取得到, 但读不到未提交的数据
UNDO
- 作用
- 用于回滚, 实现事务的原子性
- 实现多版本并发控制(MVCC)
- 原理
- 在数据操作执行之前,先将牵扯到的数据备份到undo log, 然后再进行数据的操作。
Undo Log参与事务的简化过程
假设有A、B两个数据,值分别为1,2。
A.事务开始.
B.记录A=1到undo log.
C.修改A=3.(写⼊入缓冲区)
D.记录B=2到undo log.
E.修改B=4.
F.事务提交
- 如果出现回滚操作,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。
- Undo log必须先于数据持久化到磁盘。如果在D,E之间系统崩溃,undo log是完整的,可以用来回滚事务。
REDO
- Redo Log记录的是新数据的备份。
- 作用
- 保证事务持久性
- 原理
- 新数据写入内存缓冲区后, 将执行的更更新操作写入redo log, 再将数据写入磁盘(⼀定发生在redo写入之后, 但未必立即执行)
- 当系统崩溃时,虽然数据没有写入磁盘,但是Redo Log已经持久化。系统可以根据
Redo Log的内容,将所有数据恢复到最新的状态。 - 虽然redo log 和写入数据库 都是写入磁盘, 但是redo log的性能⾼高于写入数据库
Undo + Redo事务的简化过程
假设有A、B两个数据,值分别为1,2.
A.事务开始.
B.记录A=1到undo log.
C.修改A=3.(写入缓冲区)
D.记录A=3到redo log.(之后的某个时间点写入磁盘)
E.记录B=2到undo log.
F.修改B=4.
G.记录B=4到redo log.
J.事务提交
- 数据库恢复
- mysql重启后⾃自动进行
- 先REDO,再UNDO
- 进行恢复时,
- REDO不区分事务, 会重做所有操作(包括未提交的操作和最终回滚的操作)
- 然后再由UNDO来回滚未提交和要执行回滚的事务