一个打开的事务回滚的所有方式是什么?

Som*_*Guy 5 sql-server transaction rollback connectivity

当一个事务在 SQL Server 中打开时,它可以回滚的所有方式是什么?我们目前正在使用一个 3rd 方应用程序,该应用程序经常在查询处于睡眠状态时显示打开的事务,有时会持续数天(通过 sp_WhoIsActive 显示)。这使我相信应用程序中某处存在错误,不允许提交事务。这些事务可能回滚的所有方式是什么?

  1. 客户端超时(如果指定)
  2. 客户端关闭或重新启动应用程序
  3. 手动终止 SPID
  4. 还要别的吗?

我应该对已经打开数小时或数天的交易做些什么吗?如果他们无论如何都要回滚或超时,那么终止进程有什么害处吗?

Han*_*non 8

添加@RLF在他的回答中提供的内容;以下也将导致事务回滚。

  1. ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 将回滚任何打开的事务。

  2. 客户端、服务器或两者之间的任何基础设施断开连接。

  3. 如果底层磁盘子系统消失,所有打开的数据库连接都将终止。未提交的事务将在随后打开数据库时回滚。

  4. 如果服务器关闭,或出于任何原因退出,未提交的事务将在启动并打开关联的数据库时回滚。

  5. 如果SET XACT_ABORT ON设置,则任何引发运行时错误的 T-SQL 语句都将导致打开的事务回滚。

  6. 批处理范围的事务,适用于多个活动结果集 (MARS),尚未提交的事务将在批处理完成时回滚。

  7. 为了完整ROLLBACK TRANSACTION起见,很明显,将回滚事务。

  8. 如果在事务打开时事务日志已满,并且随后由于任何原因关闭了数据库,则在数据库重新联机时将发生回滚。

  9. 如果SET IMPLICIT_TRANSACTIONS ON;设置,包括ANSI默认,未提交的事务将在客户端断开连接时自动回滚。