每次在数据库中进行更新操作时,都会先将更改的描述写入日志中。例如,如果您将列值从A更新为B,则日志将包含一条更新记录,类似于:在表T中,列C通过事务ID I对键K的记录从A更改为B。如果回滚事务,则引擎将开始向后扫描日志,查找事务执行期间的工作记录,并撤消工作:当它找到从A到B的更新记录时,将将该值更改回A。插入操作将通过删除插入行来撤消。删除将被通过重新插入该行来撤消。这在事务日志逻辑结构和预写式事务日志中有描述。 这是一个高级别的解释,实际发生的内部详细信息对非专业人士未经记录,且不可由您检查或更改。
就其实现方式而言,事务中所进行的所有数据修改都存储在事务日志中,此外,日志中还为撤消记录保留了一定空间,以备回滚时需要。每个事务日志都包含足够的信息来撤销其所做出的更改,以便在必要时撤消其更改(以及在灾难恢复方案中重放它们)。以简单的删除操作为例(因为我已经在此处解码作为日志内容的示例),被删除的记录被存储在 LOP_DELETE_ROWS 的事务日志条目中,通过一些不那么简单的努力,您可以解码并演示整个行在日志条目中。如果要回滚事务,将使用保留在日志中的撤消空间,并重新插入该行。预留空间的原因是确保在事务进行过程中不能填满事务日志,使其无法完成或回滚。