SQL Server执行长时Update查询时服务器断电,数据会发生什么变化?
SQL Server 断电场景下Update查询的数据变化问题
这是SQL Server事务机制相关的经典面试题,具体场景为:假设一条Update查询完整执行需要30秒,查询运行过程中部署SQL Server的服务器突然断电,两种场景下的数据变化如下:
场景1:未使用Transaction包裹的Update查询
SQL Server默认开启自动提交事务模式,单条DML语句本身会作为一个独立的隐式事务执行,遵循事务的原子性要求:
- 如果断电时这条Update还没执行完成、事务未提交:SQL Server重启后会通过事务日志回滚这条Update已经执行的所有修改,数据完全恢复到语句执行前的状态,相当于这条Update从来没运行过
- 如果断电前刚好整条Update执行完成、事务已经提交:所有修改会永久生效,不会丢失
核心结论:单条未显式包裹事务的Update本身是原子操作,不会出现部分修改生效的中间状态
场景2:使用Transaction包裹的Update查询
显式事务的提交完全由手动执行的COMMIT语句触发:
- 如果断电时还没有执行
COMMIT语句:不管这条Update是已经执行完还是执行到一半,SQL Server重启后都会回滚整个显式事务的所有修改,数据恢复到事务开启前的状态 - 如果断电前已经执行了
COMMIT语句且对应的事务日志已经持久化到磁盘:事务内的所有修改都会永久生效,不会丢失
内容的提问来源于stack exchange,提问作者Baber Ali Siddique
相关产品推荐
相关产品推荐

