mysql事务原理-undolog和redolog

undo log:

保证事务的原子性

undolog会记录命令相反操作的记录,比方说你执行的delete语句,它会记录对应的一条insert记录,当你需要事务回滚的时候,就可以根据undolog,恢复到之前的数据。undolog在事务执行过程中不断记录。undolog存储在表空间的段中,段有回滚段,数据段和索引段,它就是在回滚段中,内部包含1024个undolog段

事务回滚代表事务执行失败,此时恢复数据依靠的就是undolog,事务提交代表事务执行成功,但是并不会立马删除undolog,因为它可能要用于mvcc的快照读。

一致性的保证:

数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。**也就是说ACID四大特性之中,原子性,隔离性,持久性是数据库为了保证一致性提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性也无法保证。

但是,如果你在事务里故意写出违反约束的代码,一致性还是无法保证的。例如,你在转账的例子中,你的代码里故意不给B账户加钱,那一致性还是无法保证。因此,还必须从应用层角度考虑。

从应用层面,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据!

redo log:

保证事务的持久性

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

是用来实现事务的持久性
由两部分组成:
重做日志缓冲(redo log buffer)在内存中。
重做日志文件(redo log file)在磁盘中。

当bufferpool中的数据页发生了修改,在一定时机会将内存中新的数据刷新到磁盘中保证数据的一致性。
如果数据从内存中刷新到磁盘的过程出错了,内存中的数据未刷新到磁盘中,但是事务已经提交成功了,它为了保证事务完成对数据修改是永久的,redologbuffer会在bufferpool中数据修改时,记录修改的数据页,当事务交之后,redologbuffer中的记录也会刷新到磁盘中,也就是形成了redologfile,这个文件是追加的。如果重做日志缓冲区中的记录不能成功刷新到磁盘,就会进行事务的回滚,保证数据的持久性和一致性。
如果数据从内存中刷新到磁盘的过程没有失败,那么磁盘中redologfile中对应的日志也就不需要了,也就是循环使用redologfile文件。

所以内存数据刷新到磁盘失败,还可以根据redologfile 来进行数据恢复。切记是先记录日志,因为日志文件是顺序磁盘io,后将缓存中的数据刷新到磁盘上,因为它是随机磁盘io,这个机制叫做WAL,write ahead logging
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值