我正在开发一个以C#和SQL Server作为数据库的.NET Web应用程序,这两种技术都是新手。当我试图同时保存大量信息时,我遇到了问题。
我的代码很简单:
SqlConnection cn = null;
try
{
using (TransactionScope scope = new TransactionScope())
{
using (cn = Util.getConnection())
{
cn.Open();
BusinessObject.saveObject1(param1, cn);
BusinessObject.saveObject2(param2, cn);
BusinessObject.saveObject3(param3, cn);
BusinessObject.saveObject4(param4, cn);
...
scope.Complete();
}
}
我总是使用相同的连接对象,因为如果发生错误,我必须撤销我的数据中的任何更改,并且如果进程正常则需要相同的行为。
我不介意保存过程需要花费很多时间,在我的应用程序中是完全正常的,因为我必须保存大量信息。
这里的怪异是:
我试图通过web.config中的连接字符串更改数据库的超时,但它没有解决任何问题。另外,如果在每个executeNonQuery()语句之后执行cn.Dispose(),我在下次尝试使用连接对象时会收到错误。
我是否必须更改TransactionScope对象的参数?还有另一种更好的方法吗?
先谢谢。
答案 0 :(得分:2)
这是由于超时错误造成的。 TransactionScope
可能决定在超时的情况下回滚事务。
您需要在TransactionScope
构造函数中增加超时值。默认最大值超时是10分钟。
答案 1 :(得分:1)
将scope.Complete();
移到connection
区块(MSDN article)之外。
答案 2 :(得分:1)
您是否尝试在Timeout = 0
功能中设置Util.getConnection()
?值0表示没有限制。这肯定会完成这项工作。通过设置Timeout = 0
将完成每个长期操作作业。