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

In Log-Based Recovery why do we redo committed transactions?

日志是一系列日志记录,它维护着数据库更新活动的相关信息。每当事务开始、读取、写入或提交时,它都会用特定的操作在日志中注册自己。因此,现在从失败中恢复时,如果事务尚未提交,则需要撤消事务;如果事务已提交,则需要重做。我怀疑这样做背后的逻辑。为什么我们需要重做已提交的事务?

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

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

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

因为它们在 SGA 中,它们对其他用户可见,但如果不立即写入数据文件,这些更改在提交后仍可能丢失。

参考: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