多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # undo log **undo log是每次修改数据前,先把数据本来的形态记录到undo log中,再修改数据** **Undo日志记录一定要在所有的新余额写入硬盘之后再写入,因为提交事务是以undo log为准的** **数据修改后不是直接写到mysql的表中,而是写带redo log中,再由redo log一次性写到mysql表中** 比如旺财有200块钱, 小强有50 块钱,现在旺财要给小强转账,假设转100块吧, 你说说,你是怎么实现要么不做,要么全做的。 ” (1) 开始事务 T1 (假设T1是个事务的内部编号) (2) 旺财余额 = 旺财余额 -100 (3) 小强余额 = 小强余额 + 100 (4) 提交事务 T1 ~~~ [开始事务 T1] [事务T1, 旺财原有余额,200] [事务T1, 小强原有余额,50] [提交事务 T1] ~~~ 什么时候应该记录Undo日志,什么时候把Undo日志写入文件呢? 一开始的时候我都不知道程序到底要操作那个字段,怎么记录Undo日志,怎么写入硬盘文件? 把日志记录也放到了内存的Undo日志缓冲区,伺机写入硬盘 ![](https://box.kancloud.cn/6be9792550338f53c58abcc5fd306e7f_599x509.png) 如果系统在第4步和第5步之间崩溃,旺财的余额写入了硬盘,但是小强的还没写入, 那Undo日志看起来是这样的: ~~~ [开始事务 T1] [事务T1, 旺财原有余额,200] ~~~ 由于找不到事务结束的日志, 你会进行恢复操作, 把旺财的原有余额给恢复了。 ” Tomcat 接过来说:“如果是在第7步和第8步之间系统崩溃,旺财和小强的最新余额都写入了硬盘,但是没有提交事务, 那Undo日志看起来是这样的: ~~~ [开始事务 T1] [事务T1, 旺财原有余额,200] [事务T1, 小强原有余额,50] ~~~ 由于没有事务结束的日志,你也需要进行恢复,把旺财和小强的原有余额恢复成200和50 ” 如果是在第8步和第9步之间系统崩溃, 旺财和小强的最新余额都写入了硬盘, 也提交了事务, 但是提交事务的操作没有写入Undo 日志, 所以Undo日志还是这样:” ~~~ [开始事务 T1] [事务T1, 旺财原有余额,200] [事务T1, 小强原有余额,50] ~~~ 由于没有事务结束的日志,你还得需要进行恢复,把旺财和小强的原有余额恢复成200和50” 是不是可以应付各种情况啊? ~~~ 1. 在你把最新余额写入硬盘之前, 一定要先把相关的Undo日志记录写入硬盘. 例如[事务T1, 旺财原有余额,200] 一定要在旺财的新余额=100写入硬盘之前写入。 2. [提交事务 T1] 这样的Undo日志记录一定要在所有的新余额写入硬盘之后再写入. 有了这两条的保证,我就可以高枕无忧了!, 比如说,换个操作次序也没有问题:” ~~~ ![](https://box.kancloud.cn/55d62097a7aa5bef838841b336724631_594x461.png)