如何终止或回滚活动事务?

16

如何终止或回滚未提交的事务?

我正在使用以下SQL列出我的活动事务:

SELECT * FROM sys.dm_tran_session_transactions 

我的结果是:

session_id  transaction_id       transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound
----------------------------------------------------------------------------------------------------------------------
54          117260               0x0100000036000000     0            1                   1        0           0

我不想杀死会话(54)...

谢谢大家


2
我认为你做不到。我猜你可以尝试工程化一个错误来停止事务,如果 XACT_ABORT 打开,它会自动回滚,但这有什么意义呢?为什么不杀掉 spid 呢? - Martin Smith
我不想杀死SPID,因为我不想杀死用户的会话,但我想我必须这样做...我没有任何意见。 - ogun
他可能不希望通过终止会话来断开用户的连接。 - orka
2个回答

26

为了清除所有交易,请仅使用此作为临时解决方案。

ALTER DATABASE DatabaseName

SET SINGLE_USER

WITH ROLLBACK IMMEDIATE;

ALTER DATABASE DatabaseName

SET MULTI_USER;

请参考此网站了解更多信息。

需要注意的是-它还会回滚已提交的事务。


仅使用此作为临时解决方案,因为这将取消所有翻译。 - Arun Prasad E S
SQL Server 12.0 -- "ALTER DATABASE语句不允许在多语句事务中使用。" - Dmitry Ginzburg
我在(sql authority .com)上找到了这个,请参考该网站获取更多详细信息... - Arun Prasad E S
谢谢,那在紧急情况下帮了我一把 ;) - SQL Police
1
我尝试了这段代码,发现它也会回滚已提交的事务。我不知道它是否会回滚当前会话。这是一个很好的临时解决方案,让我感到很开心。 - Alican Uzun
1
@AlicanUzun,正如您所提到的,回滚已提交的事务在可用性方面受到了一些非常特殊情况的限制。 - QMaster

7

如果没有杀死所有者会话,您无法从另一个会话中终止/回滚事务。

我认为,允许从另一个用户的会话中终止/回滚事务意味着违反了许多设计和安全规则,因为它需要进入另一个用户的会话(在当前 SQL Server 引擎设计的上下文中)。这可能是为什么没有实现它的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接