2020-08-24---mysql篇---事务与日志

Mysql事务与日志

这里的事务 , 是指在单个mysql实例上的事务 , 并非是分布式事务

本文仅仅只是对于我 学习这个东西的一个小总结. 归纳不会太详细.

推荐博文 : https://www.cnblogs.com/superchong/p/10847966.html


自问自答
  1. 事务的ACID是什么?

    A ( 原子性 ) : 对于事务来说, 事务中的操作 要么 都成功, 要么都失败

    C( 一致性 ) : 是指 事务提交的前后, 数据都是正确合法的.

    I ( 隔离性 ) : 表示 事务之间是存在隔离的. 个个事务之间的相互影响性

    D ( 持久性 ) : 表示事务一旦提交, 对数据库的修改是持久性的, 不会被改变.


  2. 那么ACID是如何被实现的呢 ?

    ​ 对于 原子性 和 隔离性 , 使用的是 undo日志 来保证的, undo日志主要作用是用于数据的回滚, 对于原子性来说, 如果失败 , 就需要发生数据的回滚 , 需要使用undo日志进行 数据重构 (对于 insert的操作, 使用delete , 对于 delete的操作, 使用 insert , 对于update 的操作, 使用反向的update … )

    ​ 对于 持久性 而言, 使用的是 redo 日志来进行保证, 首先. redo日志 是一个物理层面的日志 , 它记录的是 底层的 哪个物理页 需要做哪些操作. 在mysql中… 如果每一次数据的变更, 都进行io的话, 会损失很多的性能. 因此 mysql 引入了一个 buffer pool 的东西. 数据的变更 首先会写入 这个 buffer pool , 就相当于写入成功了…buffer pool 什么时候会真正的刷入磁盘就不管了… 因此 这里会出现一个持久性的问题… 因为 buffer pool 是在内存中的… 如果产生断电啥的, 就会丢失. 因此引入 redo日志. 在写入buffer pool 之前, 会先写入redo日志. 对于 redo 写入磁盘 ,可以有多种方式进行选择(默认 是事务提交的时候, redo日志会写入磁盘, 也可以使用 每秒一次 , 也可以使用 每一次操作, 就写入磁盘) (值得注意的是, redo 写入磁盘 是一个 顺序的IO , 会比 buffer pool 写入磁盘的随机IO 要快).之后的话, 就算mysql 发生了断电 , 也可以使用 redo 日志恢复到最新的状态.


  3. redo日志 和 bin 日志的区别 ?

    • redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
    • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑。
    • redo log 是循环写的,空间固定会用完(4个文件,每个文件1G);binlog 是可以追加写入的。“追加写”是指 binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
    • binlog 日志没有 crash-safe 的能力,只能用于归档。而 redo log 来实现 crash-safe 能力。
      • (redo log 用于保证 crash-safe 能力。innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到磁盘)
      • sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘。
    • 额外补充 :
      • 对于 binlog 来说, 它有2种数据的存储方式, 默认的是使用sql 进行存储(statement方式) , 也可以修改成 row 方式, 会记录修改前的数据 , 和修改后的数据 ( 在分布式事务的情况下, 最好使用 row , 因为 binlog 可以进行 主从复制, 如果使用 sql , 会自带事务的问题, 有可能引发表锁, 死锁之类的事情 )
      • binlog , 可以使用在 mysql的主从复制 的架构中. 从mysql 会 获得 主msyql的 binlog , 来修改自己的数据情况 , 从而到达同步的效果

额外补充
  • MVCC 是一种 innodb 实现 事务隔离的一种方式, 它是基于 undo 日志的. 对于每一行数据, 它都会额外的增加 一些隐藏列, 比如 版本号(创建 , 删除时候的) , 还有指向的undo日志… 等 , 当一个事务去查看它所能看到的数据的时候, 会对当前数据 进行一个修正 . 使用 undo日志 , 对这些数据 进行回滚 的操作. 变成 应该能够 让事务看到的 情况…
  • MVCC手段只适用于Msyql隔离级别中的读已提交(Read committed)和可重复读(Repeatable Read)
  • 当所有的事务都不用追溯到 某一个数据的 前N个状态的时候, 对应的undo日志就会被删除.

结束.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值