SQL Server执行COMMIT提交事务时是否有可能发生死锁?
解答
核心结论
所有数据操作执行完成后,在COMMIT阶段确实有可能发生死锁,这是SQL Server中真实存在的场景。
原因说明
- 死锁的本质是两个及以上会话互相持有对方所需的资源,且都不主动释放已持有资源,形成循环等待。很多人误以为只有增删改等数据操作才会申请锁,实际
COMMIT阶段依然需要申请额外的系统资源完成提交流程,只要满足死锁的四个必要条件,就会触发死锁。 COMMIT阶段常见需要申请的资源包括:- 事务日志写入的相关锁:提交时需要将事务的所有日志记录持久化到磁盘,这一步需要获取日志缓冲区、日志文件的相关访问锁
- 元数据锁:如果事务涉及触发器、级联操作、行版本控制(如快照隔离、读提交快照隔离),提交时需要修改对应的系统元数据,需要申请对应的元数据锁
- 分布式事务相关的协调资源锁:如果是跨实例的分布式事务,提交阶段的两阶段提交流程需要申请更多跨实例的协调资源,死锁概率更高
- 这类提交阶段的死锁发生概率远低于数据操作阶段,但属于正常的数据库运行现象,处理逻辑和普通死锁一致:被选为死锁牺牲品的事务会完全回滚,返回1205错误码。
内容的提问来源于stack exchange,提问作者thisextendsthat
相关产品推荐
相关产品推荐

