Sql server 中断长时间运行的存储过程的最佳方法是什么?

Sql server 中断长时间运行的存储过程的最佳方法是什么?,sql-server,ado.net,transactions,Sql Server,Ado.net,Transactions,中断长时间运行的存储过程(最多20分钟)的最佳方法是什么? 存储过程的内部被包装在事务中。如果我关闭连接,此事务是否会回滚? 另一种方法是在启动存储过程之前在C#中启动事务,当我要取消存储过程时,我只需要回滚C#事务。如果关闭连接,SQL Server会在事务提交之前注意到断开连接,则会回滚事务。将有一个(非常)小的时间窗口,当您断开连接时,事务可能会完成 自定义事务增加了复杂性,对单个存储过程调用没有什么好处。因此,我选择断开连接。在开始事务时设置超时。您可以在页面超时中的三个位置设置超时——

中断长时间运行的存储过程(最多20分钟)的最佳方法是什么? 存储过程的内部被包装在事务中。如果我关闭连接,此事务是否会回滚?
另一种方法是在启动存储过程之前在C#中启动事务,当我要取消存储过程时,我只需要回滚C#事务。

如果关闭连接,SQL Server会在事务提交之前注意到断开连接,则会回滚事务。将有一个(非常)小的时间窗口,当您断开连接时,事务可能会完成


自定义事务增加了复杂性,对单个存储过程调用没有什么好处。因此,我选择断开连接。

在开始事务时设置超时。

您可以在页面超时中的三个位置设置超时——连接、命令,以及如果您最终正在编写网页

在这种情况下,相关的超时是命令超时

更新:用户事件取消: 要通过用户事件取消命令,请对该命令调用cancel()。我还没有编写代码来测试这一点,但我怀疑一旦调用ExecuteReader(),它就会阻塞,因此需要一个异步调用--BeginExecutenQuery(),设置起来确实很麻烦--它需要查询字符串上的额外内容,我想它需要SQL2005+

更新:Re:交易 C#(或ADO.NET)事务代码添加了大约两行代码,并保证存储过程的调用(存储过程中可能包含多个语句,但不是今天,可能是一年后)作为一个单元成功或失败。它们通常不是性能差的原因,在不使用时也可能是性能差的原因——例如,长系列插入在事务中运行得更快


如果您不调用CommitTrans(),事务将回滚,您不必显式地调用rollback()

您是想让用户决定“嗯,时间太长了”并让他取消它,还是想按策略取消“已经20分钟了,呼叫将自动取消”我给用户这个机会(实际上,这是一项支持命令取消的服务)。好的,我已经更新了我的答案,添加了关于事务的内容,asychI无法这样做,因为有时业务逻辑需要如此长的操作。我们使用的是SQL Server 2008 R2,所以这不是问题。谢谢。谢谢你的回答,我决定只断开连接,允许SQL Server回滚事务本身。