取消查询后,交易仍处于打开状态

fku*_*cuk 6 sql transactions sql-server-2008

在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
Run Code Online (Sandbox Code Playgroud)

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

这是预期的行为吗?或者我的模式中有错误.它不应该回滚交易吗?

Ole*_*Dok 9

恕我直言,这是一个预期的行为.当您在打开事务时取消查询运行时 - 它将保持打开状态,直到您显式提交或回滚它直到连接未关闭为止

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

更新:

查询执行后,行为由SSMS选项Disconnect控制- 这意味着查询在执行或取消后断开连接并回滚打开的事务: 在此输入图像描述

  • 这个答案似乎回避了问题的精神......问题可以改为"为什么取消查询不会触发try/catch构造的"捕获"块?" 如果这是预期的行为,为什么?作为proc的设计者,我希望proc能够成功完成或回滚 - try/catch的隐含语义不允许"停止执行但不担心catch块",并使事务处于打开状态直到SQL Server决定在断开连接时清理交易"......一个明智的行为是提出"取消错误",当然? (2认同)