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 读已提交级别
    • 仍然有快照读, 事务提交成功的数据可以读取得到, 但读不到未提交的数据

事务隔离级别

  • 四个级别, 只会⽤用到读已提交和可重复读这两个
  • mysql默认为可重复读
  • 更建议使⽤用 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来回滚未提交和要执行回滚的事务

转载于:https://www.cnblogs.com/oklizz/p/11454190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值