Sql 取消查询后,交易仍处于打开状态
在sql server 2008中,我使用的模式如下: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(),
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-)我会把我放在那里