【发布时间】:2010-02-22 03:03:31
【问题描述】:
sql server中事务回滚的机制是什么?
【问题讨论】:
-
模棱两可的问题,你的意思是语法是什么,或者它实际上是如何做到的,即通过事务日志。
-
我想知道它实际上是怎么做的。我知道它的语法。
标签: sql-server transactions rollback
sql server中事务回滚的机制是什么?
【问题讨论】:
标签: sql-server transactions rollback
数据库中的每次更新都会首先在日志中写入一个包含更改描述的条目。例如。如果您将列值从 A 更新到 B,则日志将包含更新记录,例如:在表 T 中,列 C 已从 A 更改为 B,以记录具有键 K 的记录,事务 ID 为 I。如果您回滚事务,引擎将开始向后扫描日志以查找您的事务完成的工作记录并撤消工作:当它找到从 A 到 B 的更新记录时,会将值更改回 A。插入将被撤消通过删除插入的行。通过插入该行将撤消删除。这在Transaction Log Logical Architecture 和Write-Ahead Transaction Log 中有描述。
这是高级解释,确切的内部细节是如何发生的,外行没有记录,也不受您的检查或更改。
【讨论】:
看看ROLLBACK TRANSACTION (Transact-SQL)
回滚显式或隐式 交易开始 事务,或到里面的保存点 交易。
【讨论】:
就其实现方式而言,事务中的所有数据修改都存储在事务日志中,日志中还为撤消记录保留了额外的空间,以防它必须回滚。 每个事务日志中都有足够的信息来撤销所做的更改,以便它可以在需要时撤消更改。 (以及在 DR 场景中重放它们)
如果我们以一个简单的删除操作为例(因为我以decoded that here 作为日志内容的示例),被删除的记录存储在 LOP_DELETE_ROWS 的事务日志条目中,并且您需要付出一些不小的努力可以解码并证明整行都在日志条目内。
如果要回滚事务,将使用日志中保留的撤消空间,并重新插入行。 undo预留空间的原因是为了保证事务日志不能在事务中被填满,没有空间完成或回滚。
【讨论】: