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来回滚未提交和要执行回滚的事务
posted @ 2019-09-03 17:08  太虚真人  阅读(175)  评论(0编辑  收藏  举报