2011-11-17 68 views
1

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

+0

你试图让用户决定,“嗯,它已经太长时间”,让他取消它,或者你是否试图取消政策“已经20分钟,通话将自动取消” – MatthewMartin

+0

我给这个机会给用户(实际上它是一个支持取消命令的服务)。 – Eugene

+0

好的,我已经更新了我的答案,以添加我的2cent关于事务和asych – MatthewMartin

回答

2

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

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

+0

感谢您的回答,我决定简单地断开连接并允许SQL Server回滚事务本身。 – Eugene

0

设置在开始交易时超时。

+0

我不能这样做,因为有时业务逻辑需要这么长的操作。 – Eugene

1

您可以在三个位置设置超时时间 - 连接,命令,以及如果您最终正在编写网页 - 在页面超时。

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

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

UPDATE:回复:交易 C#(或ADO.NET)交易代码将大约两行代码,并确保存储过程调用(其中可能有更多而不是在今天,也许是从现在开始的一年)中的一个声明)作为一个单元成功或失败。它们通常不是性能差的来源,并且在不使用时可能成为不良性能的来源 - 例如,一系列长插入在事务中运行得更快。

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

+0

我们正在使用SQL Server 2008 R2,所以这不是问题。谢谢。 – Eugene

相关问题