问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏
MySQL的undo有什么作用?
重做日志记录了事务的行为,可以很好地通过其对页进行”重做”操作,但是事务有时还需要进行回滚操作,这时就需要undo。 因此在对数据库进行修改时,InnoDB 存储引擎不但会产生redo,还会产生一定量的undo。这样如果用户执行的事务或语句由于原因失败了,又或者用户用一条rollback 语句请求回滚,就可以利用这些undo 信息将数据回滚到修改之前的样子。
redo 存放在重做日志文件中,与redo 不同,undo 存放在数据库内部的一个特殊段(segment)中,这个段称为undo段 。undo 段位于共享表空间内。
undo是逻辑日志,因此只是将数据库逻辑地恢复到原来的样子。所有修改都被逻辑地取消了,但是数据结构和页本身在回滚之后可能大不相同。这是因为在多用户并发系统中,可能会有数十,数百甚至数千个并发事务。数据库的主要任务就是协调对数据记录的并发访问。比如,一个事务在修改当前一个页中某几条记录,同时还有别的事务在对同一个页中另几条记录进行修改。因此,不能将一个页回滚到事务开始的样子,因为这样会影响其他事务正在进行的工作。
undo 除了回滚操作,undo 的另一个作用是 mvcc,即在InnoDB 存储引擎中mvcc 的实现是通过undo 来完成。当用户读取一行记录时,若该记录已近被其他事务占用,当前事务可以通过undo 读取之前的行版本信息,以此实现 非锁定读取。
最重要的一点是,undo log 会产生redo log ,也就是undo log 的产生会伴随着redo log 的产生,这是因为undo log 也需要持久性的保护。
评论
有用 3
墨值悬赏