在 SQL Server 中打开事务时,可以通过哪些方式回滚?我们目前正在使用第 3 方应用程序,该应用程序在查询处于睡眠状态时经常显示未处理的事务,有时会持续数天(通过 sp_WhoIsActive 显示)。这使我相信应用程序中某处存在不允许事务提交的错误。这些事务可能回滚的所有方式是什么?
- 客户端超时(如果指定)
- 客户端关闭或重新启动应用程序
- 手动杀死 SPID
- 还要别的吗?
我应该对已经开放数小时或数天的交易做任何事情吗?如果他们无论如何都要回滚或超时,那么终止进程有什么害处吗?
在 SQL Server 中打开事务时,可以通过哪些方式回滚?我们目前正在使用第 3 方应用程序,该应用程序在查询处于睡眠状态时经常显示未处理的事务,有时会持续数天(通过 sp_WhoIsActive 显示)。这使我相信应用程序中某处存在不允许事务提交的错误。这些事务可能回滚的所有方式是什么?
我应该对已经开放数小时或数天的交易做任何事情吗?如果他们无论如何都要回滚或超时,那么终止进程有什么害处吗?
添加@RLF在他的回答中提供的内容;以下也会导致事务回滚。
ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
将回滚任何打开的事务。客户端或服务器或两者之间的任何基础设施断开连接。
如果底层磁盘子系统消失,所有打开的数据库连接都将被终止。随后打开数据库时,未提交的事务将被回滚。
如果服务器因任何原因关闭或退出,未提交的事务将在它启动并打开相关数据库时回滚。
如果
SET XACT_ABORT ON
设置,任何引发运行时错误的 T-SQL 语句都将导致打开的事务回滚。批处理范围的事务,适用于多个活动结果集 (MARS),尚未提交的事务将在批处理完成时回滚。
为了完整
ROLLBACK TRANSACTION
起见,很明显,将回滚事务。如果在事务打开时事务日志已满,并且随后由于任何原因关闭了数据库,则在数据库重新联机时将发生回滚。
如果
SET IMPLICIT_TRANSACTIONS ON;
设置,包括 ANSI 默认值,当客户端断开连接时,未提交的事务将自动回滚。对于它的价值,
SLEEPING
连接通常代表一个保持连接处于活动状态但没有做任何事情的客户端。因此,连接为sleeping
。通常是无害的。但是
SLEEPING
持有OPEN 事务的连接可能(但不一定)导致其他事务或事务日志出现问题。添加到您的问题列表中:网络、路由和类似问题。