打破长时间运行的存储过程(最多20分钟)的最佳方法是什么? 存储过程内部包含在事务中。如果我关闭连接将回滚此事务? 另一种方法是在启动存储过程之前在C#中启动事务,当我想取消存储过程时,我只需要回滚C#事务。
答案 0 :(得分:2)
如果关闭连接,SQL Server将回滚事务,如果它在事务提交之前注意到断开连接。会有一个(非常)小的时间窗口,当你断开连接时,交易可能会完成。
自定义事务会增加复杂性,并且对单个存储过程调用几乎没有任何好处。所以我会选择断开连接。
答案 1 :(得分:1)
你可以在三个地方设置一个时间 - 连接,命令,如果你最终编程一个网页 - 在页面超时。
在这种情况下,相关的超时是命令超时。
更新:取消用户的活动: 要通过用户事件取消命令,请在命令上调用Cancel()。我没有编写代码来测试这个,但我怀疑一旦你调用ExecuteReader()它会阻塞,所以你需要一个异步调用 - BeginExecuteNonQuery(),这真的很难设置 - 它需要查询字符串上有额外的东西,我认为它需要SQL2005 +
更新:Re:交易 C#(或ADO.NET)事务代码添加了大约两行代码,并保证存储过程的调用(可能在其中包含多个语句,而不是今天,可能是一年后)作为一个单元成功或失败。它们通常不是性能不佳的来源,并且在不使用时可能是性能不佳的来源 - 例如一系列插入在事务中运行得更快。
如果你不调用CommitTrans()事务将回滚,你不必显式调用Rollback()
答案 2 :(得分:0)
在开始交易时设置超时。