You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

断电时事务系统如何保障一致性、原子性及操作可恢复性?

断电场景下SQL Server事务一致性与原子性实现逻辑

单字段更新断电后的状态判断与恢复规则

你当前梳理的执行流程缺了核心的事务提交校验环节,完整的WAL(预写日志)执行链路如下:

  • 事务启动后,所有修改的*前镜像(回滚用的UNDO数据)和后镜像(重做用的REDO数据)*会先写入内存中的事务日志缓冲区
  • 事务提交时,首先会把当前事务的所有日志记录,包括最后的「事务提交完成」标记,强制同步刷入磁盘上的事务日志文件,这一步完成后SQL Server就会给客户端返回事务提交成功的响应
  • 后续才会异步把内存中修改后的脏数据页,刷入磁盘上的实际表数据文件

对应你问的断电场景:

  • 如果断电发生在「事务提交标记写入磁盘日志」之前:不管内存中写了多少临时日志,重启后扫描事务日志找不到对应事务的提交标记,会直接用UNDO数据回滚该事务的所有变更,等价于这个UPDATE table SET someColumn = someColumn + 1 WHERE <whatever>操作完全没执行过
  • 如果断电发生在「事务提交标记已经写入磁盘日志」之后:哪怕脏数据页还没来得及刷入磁盘,重启后扫描日志会识别到该事务已提交,直接用REDO数据把所有变更重做一遍同步到数据页,等价于这个UPDATE操作已经执行完成

你关心的「日志已写但数据没刷」的场景不需要回滚,只要有提交标记,重启后的重做逻辑就会保证数据最终正确,不会丢失更新。

多字段更新的原子性保障逻辑

不管你在单个UPDATE里修改多少个字段,还是单个事务里包含多条增删改语句,所有变更的UNDO、REDO信息都会归属到同一个事务的日志集合中,并且只有该事务所有变更的日志都写完之后,才会写入最终的「事务提交」标记:

  • 只要事务提交标记还没刷入磁盘就断电,所有属于这个事务的变更会被统一回滚,不会出现someColumn更新了、otherColumn没更新的部分生效问题
  • 只要事务提交标记已经刷入磁盘,所有属于这个事务的变更会被统一判定为提交成功,重启后会全部重做完成,也不会出现部分更新的情况

额外说明:SQL Server的事务日志是顺序写入的,每条日志都有唯一的LSN(日志序列号),重启恢复时会自动执行三个阶段:分析阶段识别未提交事务和脏页、重做阶段把所有已提交事务的变更同步到数据页、回滚阶段把所有未提交事务的变更全部撤销,整个机制原生保证了事务的ACID特性,业务层不需要做额外的断电兼容处理。


内容的提问来源于stack exchange,提问作者Nick Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:51:00