快速了解MySQL事务日志

MySQL事务日志

⭐️写在前面

这里是允谦的学习之路
👍如果对你有帮助,给博主一个免费的点赞以示鼓励把QAQ
👋博客主页🎉 允谦的学习小屋
⭐️更多文章👨‍🎓请关注允谦主页📝
🍅文章发布日期:2022.02.27
👋java学习之路!
欢迎各位🔎点赞👍评论收藏⭐️
🎄冲冲冲、持续更新🎄

事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是什么机制实现的呢?

  • 事务的隔离性由锁机制实现的
  • 而事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证。
    • REDO LOG称为重做日志,提供再写入的操作,恢复提交事务修改的页操作,用来保证事务的持久性
    • UNDO LOG称为回滚日志,回滚行记录到某个特定的版本,用来保证事务的原子性、一致性

REDO和UNDO都可视为一种恢复操作,但是

  • redo log:是存储引擎层生成的日志,记录的是物理级别上的页修改操作,比如页号xxx,偏移量yyy,写入了zzz数据,主要为了保证数据库的可靠性
  • undo log :是存储引擎层生成的日志,记录的是逻辑操作日志,比如对某一行数据进行了INSERT语句操作,那么Undo日志就记录一条与之相反的delete操作,主要用于事务的回滚一致性非锁定读

1、redo日志

1.1 REDO日志的好处、特点

1、好处
  • redo日志降低了刷盘频率
  • redo日志占用的空间非常小

存储表空间ID、页号、偏移量以及需要更新的值,所需的存储空间很小,刷盘快

2、特点
  • redo日志是顺序写入磁盘的
  • 事务执行过程中,redo log不断记录

1.2 redo的组成

Redo log可以简单的分为以下两个部分:

  • 重做日志的缓冲(redo log buffer),保存在内存中,是易丢失的。

在服务器启动时就向操作系统申请了一大片称之为redo log buffer的连续内存空间,这片内存空间被划分为若干个连续的redo log block。一个redo log block占用512字节的大小
在这里插入图片描述

参数设置innodb_log_buffer_size:

redo log buffer大小,默认是16M,最大值是4096M,最小值是1M

show variables like '%innodb_log_buffer_size%';
  • 重做日志文件 redo log file,保存在硬盘中,是持久的

1.3 redo log 的刷盘策略

redo log的写入并不是直接写入磁盘的,InnoDB引擎会在写redo log 的时候先写redo log buffer,之后以一定的频率刷入到真正的redo log file中。

注意,redo log buffer刷盘到redo log file的过程并不是真正的刷到磁盘中去,只是刷入到文件系统缓存(pagecache)中去(这是现代操作系统为了提高文件写入效率做的一个优化),真正的写入会交给系统自己来决定(比如page cache足够大了)。那么对于InnoDB来说就存在一个问题,如果交给系统来同步,同样如果系统宕机,那么数据也丢失了(虽然整个系统宕机的概率还是比较小的)。

针对这种情况,InnoDB给出innodb_flush_log_at_trx_commit参数,该参数控制commit提交事务时,如何将redo log buffer中的日志刷新到redo log file中,它支持三种策略

  • 设置为0:表示每次事务提交时不进行刷盘操作(系统默认master thread每隔1s进行一次重做日志的同步)
  • 设置为1:表示每次事务提交时都进行同步,刷盘操作(默认值)
  • 设置为2:表示每次事务提交都只把redo log buffer内容写入page cache,不进行同步,有系统自己决定什么时候同步到磁盘文件
show variables like 'innodb_flush_log_at_trx_commit';

另外,InnoDB存储引擎中有一个后台线程,每隔1s都会将redo log 写入page cache中

2、Undo日志

redo log是事务持久性的保证,Undo log是事务原子性的保证,在事务中更新数据的前置操作其实是要先写入一个undo log。

2.1 如何理解Undo日志

事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。但有时候事务执行到一半会出现一些情况,比如:

  • 情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误。
  • 情况二:程序员可以在事务执行过程中手动输入ROLLBACK语句结束当前事务的执行。

以上情况出现,我们需要把数据改回原来的样子,这个过程称为回滚,这样就可以造成一个假象:这个事务看起来什么都没做,所以符合原子性的要求。

2.2Undo日志的作用

  • 回滚数据
  • MVCC

样子,这个过程称为回滚,这样就可以造成一个假象:这个事务看起来什么都没做,所以符合原子性的要求。

2.2Undo日志的作用

  • 回滚数据
  • MVCC
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

允谦呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值