【问题标题】:Transaction is still open after cancelling query取消查询后交易仍处于打开状态
【发布时间】:2012-01-03 07:18:43
【问题描述】:

在 sql server 2008 中,我使用的是这样的模式:

begin transaction

begin try

/* do something */

end try

begin catch

if @@TRANCOUNT > 0
rollback

 DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int                              
  SELECT @ErrMsg = ERROR_MESSAGE(),                              
         @ErrSeverity = ERROR_SEVERITY()                              

  RAISERROR(@ErrMsg, @ErrSeverity,1)     

end catch

if @@TRANCOUNT > 0
commit transaction

当我点击 Sql Server Management Studio 上的“取消执行查询”按钮时,它会取消查询并使事务保持打开状态。

这是预期的行为吗?还是我的模式有错误。它不应该回滚事务吗?

【问题讨论】:

    标签: sql sql-server-2008 transactions


    【解决方案1】:

    恕我直言,这是一种预期行为。当您取消正在运行的查询(如果有打开的事务)时 - 它保持打开状态,直到您明确提交或回滚它直到连接未关闭

    您的模式中没有任何有价值的错误。如果您手动控制执行流程(取消执行查询),那么您应该以相同的方式处理打开的事务 - 手动。

    更新:

    行为由 SSMS 选项控制在查询执行后断开连接 - 这意味着查询在执行或取消后断开连接并回滚打开的事务:

    【讨论】:

    • 这个答案似乎回避了问题的精神......这个问题可以改写为“为什么取消查询不会触发 try/catch 构造的“catch”块?”如果这是预期的行为,为什么?作为该 proc 的设计者,我希望 proc 成功完成或回滚 - try/catch 的隐含语义不允许“停止执行但不要担心 catch 块,并让事务保持打开状态直到 SQL 服务器决定在断开连接时清理事务”......一个理智的行为肯定会引发“取消错误”吗?
    • @Tao 也许你是对的,但作者接受了答案,请不要替他考虑。
    • 嘿,我会留下没有为“是的,这是一种预期的行为”声明提供参考然后:)
    • @Tao 同意 8-) 我会把恕我直言放在那里
    【解决方案2】:

    回答您的问题 - 是的。这是预期的行为。

    手动取消查询时需要回滚不是更容易记住吗?

    解决方案:手动取消任何开始事务的查询后执行回滚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2012-04-03
      • 1970-01-01
      • 2012-02-04
      相关资源
      最近更新 更多