【发布时间】:2021-11-07 08:27:19
【问题描述】:
在断电的情况下如何在事务系统中保持一致性? 例如,考虑以下在事务中执行的操作。
UPDATE table SET someColumn = someColumn + 1 WHERE <whatever>
在突然停电的情况下,如何确保操作完成与否?
来自 SQL 服务器文档:
SQL Server 使用预写日志 (WAL) 算法,该算法可确保在关联日志记录写入磁盘之前不会将任何数据修改写入磁盘。这会维护事务的 ACID 属性。 ... 必须先将日志记录写入磁盘,然后才能将关联的脏页从缓冲区缓存中删除并写入磁盘。
据我了解,使用上面SQL自增操作的例子,会出现以下操作:
- 将记录写入事务日志。
- 将更改刷新到磁盘。
当突然关机时,系统如何知道增量操作是否完成?它如何理解从何时回滚? (在将日志添加到事务日志之后,但在将更改刷新到磁盘之前,可能会发生关闭,是吗?)
我还有另一个(第二个)问题,与这个问题类似。 我们如何保证原子性?例如,
UPDATE table SET someColumn = someColumn + 1 AND otherColumn = otherColumn + 2 WHERE <whatever>
如何保证在突然断电的情况下,otherColumn字段也会更新,或者不会更新任何字段?
【问题讨论】:
标签: sql sql-server transactions