Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 取消查询后,交易仍处于打开状态_Sql_Sql Server 2008_Transactions - Fatal编程技术网

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

Sql 取消查询后,交易仍处于打开状态,sql,sql-server-2008,transactions,Sql,Sql Server 2008,Transactions,在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(),

在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
当我点击SQLServerManagementStudio上的“取消执行查询”按钮时,它会取消查询并使事务保持打开状态


这是故意的行为吗?或者我的模式有错误。它不应该回滚事务吗?

嗯,这是一种预期的行为。如果存在打开的事务,则取消运行查询时-在您显式提交或回滚它之前,它将保持打开状态,直到连接未关闭

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

更新:

该行为由SSMS选项Disconnect after The query executes(查询执行后断开连接)控制,这意味着查询在执行后断开连接或取消并回滚打开的事务:
回答您的问题-是。这是预期的行为

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


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

这个答案似乎回避了问题的实质。。。问题可以重新表述为“为什么取消查询不会触发try/catch构造的“catch”块?”如果这是预期行为,为什么?作为该过程的设计者,我希望该过程要么成功完成,要么回滚——try/catch的隐含语义不允许“停止执行,但不要担心catch块,让事务保持打开状态,直到SQL server决定在断开连接时清理事务”。。。一个理智的行为会提出一个“取消错误”,当然?@Tao也许你是对的,但作者接受了答案,请不要替他想。嘿,我会留下它,没有提供任何关于“是的,这是一个有意的行为”这句话的参考:)@Tao同意8-)我会把我放在那里