在基于日志的恢复中,我们为什么要重做已提交的事务?

时间:2017-07-25 08:31:19

标签: database commit distributed-transactions undo-redo data-recovery

日志是一系列日志记录,用于维护有关数据库更新活动的信息。每当事务开始,读取,写入或提交时,它都会在日志中通过其特定操作进行注册。因此,现在当从故障中恢复时,如果事务未提交,则需要撤消事务,如果事务已提交则需要重做事务。我怀疑这背后的逻辑是什么。为什么我们需要重做已提交的交易?

参考:幻灯片19 - http://codex.cs.yale.edu/avi/db-book/db6/slide-dir/PPT-dir/ch16.ppt

2 个答案:

答案 0 :(得分:1)

存储在SGA的数据库缓冲区中的已提交事务的数据更改不一定由数据库编写器(DBWn)后台进程立即写入数据文件中。

由于它们在SGA中,因此其他用户可以看到它们,但是如果未立即写入数据文件,则提交后这些更改仍然会丢失。 enter image description here

参考:https://docs.oracle.com/cd/B19306_01/server.102/b14220/transact.htm

图片参考:https://docs.oracle.com/cd/E17781_01/server.112/e18804/memory.htm#ADMQS174

答案 1 :(得分:0)

事务T1可能已将其所有日志记录输出到稳定存储,但数据的实际更新仍在主存储器中。如果此时发生故障,则重做此事务将确保所有因故障而实际丢失的更新现在将写入稳定存储。