SQL Server - 事务和事务日志如何工作(简化)

Nev*_*ing 3 sql-server transaction transaction-log

我有一个关于交易如何运作的理论,但如果可能的话,我希望有人可以验证它或纠正一些观点。假设我们有一个具有完整恢复模型的数据库。

现在,发生在数据库上的所有事情都首先记录到事务日志中,在到达检查点后写入磁盘。

如果我在一个显式事务中,对数据库的所有更改都会首先写入日志,但在检查点期间未提交的事务不会传播到磁盘。

如果我决定回滚事务,只需删除所有事务日志条目即可完成回滚。

如果我提交,则在下一个检查点更改后写入磁盘。

事务日志包含有关如何重做操作的说明,而不是如何撤消操作的说明,这就是为什么只能从基线备份向前恢复到时间点,而不能向后恢复的原因。

它可以从一些操作及其关于如何撤消它的重做指令中推导出来(但不是全部)。这就是商用工具如何使用事务日志恢复完整恢复模型数据库中的数据。

我的所有观点至少在某种程度上有效吗?有人可以发表评论吗?这是我关于探索事务和事务日志如何在 SQL Server 中工作的第三个也是最后一个问题。谢谢。

编辑:

简单的测试似乎反驳了我的理论,因为即使在插入 1000000 行的事务中(数据库没有其他任何内容),SQL Server 似乎也会写入主数据文件。我感到困惑和悲伤:)

Mar*_*ith 9

不,你的理论是错误的。

即使事务尚未提交,脏页也可以写入磁盘。但是,可以确保在修改页面的最后一个事务日志条目已写入磁盘之前无法写入它们。

事务日志记录确实包含足够的重做和撤消信息(除非tempdb只需要撤消)。如果您决定回滚事务,则不会从日志中删除任何内容。而是将补偿日志记录写入日志以表明这一点。

  • @NeverStopLearning - 这是 WAL 协议。在将日志缓冲区刷新到至少该点之前,不允许将脏页写入磁盘,因为如果您在该状态下崩溃,则没有任何迹象表明需要撤消更改。顺便说一句,您可能会发现这很有用 [Inside the SQL Server Transaction Log](http://bradmcgehee.com/wp-content/uploads/presentations/Inside%20the%20SQL%20Server%20Transaction%20Log.pdf) (2认同)