为什么一个事务能读取到其他事务的数据?

前言

首先我们需要明确几个前提:

  1. 如果执行多条SQL语句,这些语句对数据库的操作不是原子性的。

  2. 一个事务分为:开启、执行、提交三个阶段。

  3. 只有事务提交(commit)了数据才算做有效。

结论

        根据前提3 可以得出结论 , 就是只有事务提交了数据才算做有效,才会真正的修改/新增到数据库 , 在这之前在事务里面做的所有操作都只是记录在事务的日志里面 , 并不会真正的刷新到数据库 , 所以也就说明了 , 为什么一个正在运行的事务,  可以读到另一个事务未提交的数据 , 当然了这种情况大多数出现在并发情况下.

原因

        实际上,我们研究事务的原理,就是研究MySQL的InnoDB引擎是如何保证事务的四大特性的。

而对于这四大特性,实际上分为两个部分。 其中的原子性、一致性、持久性,实际上是由InnoDB中的两份日志来保证的,一份是redo log日志,一份是undo log日志。 而隔离性是通过数据库的锁, 加上MVCC来保证的。所以当数据库隔离级别低, 亦或者并发事务存在时才会出现这种情况,

下面着重说下这两个日志的作用

一、重做日志 redo log

1. 作用

 记录事务提交时数据页的物理修改, 用来实现事物的持久性 .当事务提交之后会把所有修改信息都存到该日志文件中, 用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用。

2. 组成 ​​​​​​​

  • 重做日志缓冲(redo log buffer), 内存中
  • 重做日志文件(redo log file), 磁盘中

3. 为什要用 redo log

在探讨为什么要用 redo log 之前我们要先去想如果没有redo log  会出现哪些问题 ?

        首先我们需要知道, 在InnoDB引擎中的内存结构中, 主要的内存区域是 缓冲池 , 在缓冲池中缓存的很多数据页 . 

        当我们在一个事务中执行了增删改查时 , InnoDB引擎会首先操作缓冲池中的数据, 此时如果缓冲池中没有对应的数据 , InnoDB引擎会通过后台线程将磁盘中的数据加载到缓冲区 , 然后在去修改数据,  被修改后的数据页 , 称之为 "脏页. 而脏页会在一定的时机 , 同样是通过后台线程刷新到磁盘中, 从而保证了缓冲区与磁盘的数据是一致的 . 但是 !!! 缓冲区的数据并不是实时刷新的 , 那么问题就出现了 , 假如在缓冲区刷新数据到磁盘中的过程出错了,  事务却显示成功了 .

解决办法, 就是引入redo log的使用

        有了redoog之后, 当对缓冲区的数据进行整删改查之后 , 会首先将数据页的操作 , 记录在redo log buffer中, 在事务提交时 , 会将redo log buffer 中的数据刷新到redo log 磁盘文件中,  如果之后在进行将缓冲区的脏页刷新到磁盘时候发生错误 , 就可以接住 redo log 进行数据恢复 , 以此来保证事务的正确性 . 

二、回滚日志 undo log

1. 作用

        用于记录数据被修改前的信息 , 可提供回滚 , 和 MVCC(多版本并发控制).

        undo log 与 redo log 记录物理日志不一样 , 他是逻辑日志 . 可以认为 当del一条数据时候 , undo log 中会记录一条对应的insert 日志 反之亦然, 当进行修改的时候 , 它同样会修改一条相反的修改sql 记录, . 所以当需要荣rollback时候 , 就可以从undo log 中读取内容进行回滚. 

Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。

Undo log存储:undo log采用段的方式进行管理和记录,存放在rollback segment回滚段中,内部包含1024个undo log segment。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值