打破长时间运行的存储过程的最佳方法是什么?

时间:2011-11-17 11:49:43

标签: sql-server ado.net transactions

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

3 个答案:

答案 0 :(得分:2)

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

自定义事务会增加复杂性,并且对单个存储过程调用几乎没有任何好处。所以我会选择断开连接。

答案 1 :(得分:1)

你可以在三个地方设置一个时间 - 连接,命令,如果你最终编程一个网页 - 在页面超时。

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

更新:取消用户的活动: 要通过用户事件取消命令,请在命令上调用Cancel()。我没有编写代码来测试这个,但我怀疑一旦你调用ExecuteReader()它会阻塞,所以你需要一个异步调用 - BeginExecuteNonQuery(),这真的很难设置 - 它需要查询字符串上有额外的东西,我认为它需要SQL2005 +

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

如果你不调用CommitTrans()事务将回滚,你不必显式调用Rollback()

答案 2 :(得分:0)

在开始交易时设置超时。