SQL Server中事务回滚的机制是什么?

8
SQL Server中事务回滚的机制是什么?

这个问题有歧义,你是指语法是什么,还是它是如何做到的,比如通过交易日志。 - Andrew
我想知道它是如何实际执行的。我知道它的语法。 - masoud ramezani
3个回答

12

每次在数据库中进行更新操作时,都会先将更改的描述写入日志中。例如,如果您将列值从A更新为B,则日志将包含一条更新记录,类似于:在表T中,列C通过事务ID I对键K的记录从A更改为B。如果回滚事务,则引擎将开始向后扫描日志,查找事务执行期间的工作记录,并撤消工作:当它找到从A到B的更新记录时,将将该值更改回A。插入操作将通过删除插入行来撤消。删除将被通过重新插入该行来撤消。这在事务日志逻辑结构预写式事务日志中有描述。

这是一个高级别的解释,实际发生的内部详细信息对非专业人士未经记录,且不可由您检查或更改。


关于未记录的部分,我正在尝试解码LOP_MODIFY_COLUMNS,感觉很困难。 - Andrew

3

3
就其实现方式而言,事务中所进行的所有数据修改都存储在事务日志中,此外,日志中还为撤消记录保留了一定空间,以备回滚时需要。每个事务日志都包含足够的信息来撤销其所做出的更改,以便在必要时撤消其更改(以及在灾难恢复方案中重放它们)。
以简单的删除操作为例(因为我已经在此处解码作为日志内容的示例),被删除的记录被存储在 LOP_DELETE_ROWS 的事务日志条目中,通过一些不那么简单的努力,您可以解码并演示整个行在日志条目中。
如果要回滚事务,将使用保留在日志中的撤消空间,并重新插入该行。预留空间的原因是确保在事务进行过程中不能填满事务日志,使其无法完成或回滚。

感谢安德鲁的帮助。 如何从日志表中获取存储的数据? - masoud ramezani
2
在查看方面,选择 * from ::fn_dblog(null,null) 在实际解释它方面,你真的不可能做到 - 它在任何现实形式上都不可读。有第三方工具可以读取日志,或者你可以从“兴趣/理解”的角度阅读一些奇怪的条目,但在那个级别上几乎没有文档记录。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接