6

sql server中事务回滚的机制是什么?

4

3 回答 3

11

数据库中的每次更新都会首先将一个条目写入包含更改描述的日志中。例如。如果您将列值从 A 更新到 B,则日志将包含更新记录,例如:在表 T 中,列 C 已从 A 更改为 B,以记录具有键 K 的记录,事务 ID 为 I。如果您回滚事务,引擎将开始向后扫描日志以查找您的事务完成的工作记录并撤消工作:当它找到从 A 到 B 的更新记录时,会将值更改回 A。插入将被撤消通过删除插入的行。通过插入该行将撤消删除。这在事务日志逻辑架构预写事务日志中进行了描述。

这是高级解释,确切的内部细节是如何发生的,外行没有记录,也不受您的检查或更改。

于 2010-02-21T19:03:31.150 回答
3

看看ROLLBACK TRANSACTION (Transact-SQL)

将显式或隐式事务回滚到事务的开头,或事务内的保存点。

于 2010-02-21T08:11:15.427 回答
3

就它的实现方式而言,事务中的所有数据修改都存储在事务日志中,日志中还为撤消记录保留了额外的空间,以防它必须回滚。每个事务日志中都有足够的信息来撤销所做的更改,以便它可以在需要时撤消更改。(以及在 DR 场景中重放它们)

如果我们以一个简单的删除操作为例(因为我已经解码了这里作为日志内容的示例),被删除的记录存储在 LOP_DELETE_ROWS 的事务日志条目中,并且通过一些非平凡的努力,您可以解码和证明整行都在日志条目内。

如果要回滚事务,则将使用日志中保留的撤消空间,并重新插入该行。undo预留空间的原因是为了保证事务日志不能在事务中被填满,没有空间完成或回滚。

于 2010-02-21T13:13:13.967 回答