undo log是怎么保证事务原子性的
最近在学数据库,碰到一个问题想不通,就是使用redolog不就可以保证事务原子性了吗。
首先写写我理解的流程:事务提交-》redolog buffer 写入磁盘-》给用户返回事务提交成功-》后台线程在合适的时机将buffer pool中的数据写入磁盘(如果失败则从redolog中恢复)。
那如果是这样的话,在事务提交以前,所有操作都是在内存中进行的,undolog还有什么意义呢。毕竟只有在事务提交以后所有操作才会全部被写到磁盘中,而这时redolog也已经记录了全部的操作了,我们直接从redolog中拿不行吗。
首先写写我理解的流程:事务提交-》redolog buffer 写入磁盘-》给用户返回事务提交成功-》后台线程在合适的时机将buffer pool中的数据写入磁盘(如果失败则从redolog中恢复)。
那如果是这样的话,在事务提交以前,所有操作都是在内存中进行的,undolog还有什么意义呢。毕竟只有在事务提交以后所有操作才会全部被写到磁盘中,而这时redolog也已经记录了全部的操作了,我们直接从redolog中拿不行吗。
全部评论

有一个版本链表,头插法,从头遍历的。
查找效率的问题,undolog直接版本链,redolog是一个连续的文件,你不能从头一个个找吧
steal/no-steal:
是否允许一个uncommitted的事务将修改更新到磁盘,如果是steal策略,那么此时磁盘上就可能包含uncommitted的数据,因此系统需要记录undo log,以防事务abort时进行回滚(roll-back)。如果是no steal策略,就表示磁盘上不会存在uncommitted数据,因此无需回滚操作,也就无需记录undo log。
mysql采用的是steal策略
原子性是要么都做,要么都不做,redo保证都做,undo保证都不做

两个对应不同的情景,undolog对应事务执行失败需要回滚到之前的状态,redolog方便断电之后的持久化
单只讲undolog保证原子性这一条,mvcc暂不讨论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享