【问题标题】:How is consistency maintained in transactional systems in the event of a power outage?在断电的情况下,如何在事务系统中保持一致性?
【发布时间】:2021-11-07 08:27:19
【问题描述】:

在断电的情况下如何在事务系统中保持一致性? 例如,考虑以下在事务中执行的操作。

UPDATE table SET someColumn = someColumn + 1 WHERE <whatever>

在突然停电的情况下,如何确保操作完成与否?

来自 SQL 服务器文档:

SQL Server 使用预写日志 (WAL) 算法,该算法可确保在关联日志记录写入磁盘之前不会将任何数据修改写入磁盘。这会维护事务的 ACID 属性。 ... 必须先将日志记录写入磁盘,然后才能将关联的脏页从缓冲区缓存中删除并写入磁盘。

据我了解,使用上面SQL自增操作的例子,会出现以下操作:

  1. 将记录写入事务日志。
  2. 将更改刷新到磁盘。

当突然关机时,系统如何知道增量操作是否完成?它如何理解从何时回滚? (在将日志添加到事务日志之后,但在将更改刷新到磁盘之前,可能会发生关闭,是吗?)

我还有另一个(第二个)问题,与这个问题类似。 我们如何保证原子性?例如,

UPDATE table SET someColumn = someColumn + 1 AND otherColumn = otherColumn + 2 WHERE <whatever>

如何保证在突然断电的情况下,otherColumn字段也会更新,或者不会更新任何字段?

【问题讨论】:

    标签: sql sql-server transactions


    【解决方案1】:

    Write-Ahead Logging (WAL)。参见例如Transaction Log Architecture

    在将日志添加到事务日志之后,但在将更改刷新到磁盘之前,可能会发生关闭,是吗?

    日志记录被添加到内存中的事务日志中,但是当提交事务时,SQL Server 等待确认所有日志记录都已写入持久媒体。并且在重新启动时,如果其所有日志记录尚未刷新到磁盘,则事务将回滚。

    并且 SQL Server 要求存储系统将更改刷新到磁盘,禁用任何非持久性写入缓存。

    【讨论】:

    • 但是如果在将事务日志刷新到磁盘之后但在将页面刷新到磁盘之前发生断电怎么办?
    • 崩溃恢复时,日志文件中的事务会被重播到数据文件中。每个页面都标有最后一个修改它的事务的日志序列号 (lsn),因此在恢复期间很容易判断事务是否已应用于页面。
    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2012-08-30
    • 2018-07-29
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多