.NET TransactionScope超时问题/ EF

4

我有一个WinForms项目,需要读取海量的xml文件(2GB+),并将数据存储在MSSQL数据库中。
10分钟后,我遇到了以下错误:
“当前连接关联的事务已完成但未被处理。在使用连接执行SQL语句之前必须处理该事务。”

我想这一定是超时问题,所以我进行了以下操作:

在我的代码中,我使用:

using (tran = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
{
   IsolationLevel = System.Transactions.IsolationLevel.Serializable,
   Timeout = TimeSpan.Zero //TimeSpan.FromHours(2)
}))
{
    /*Here I read out xml, and use EF to write to DB*/
}

我在App.config中添加了以下内容:

<system.transactions>
  <defaultSettings timeout="2:00:00"/>
</system.transactions>

我在我的machine.config文件中添加了以下内容:

<system.transactions>
   <machineSettings maxTimeout="2:00:00"/>
</system.transactions>

在MSSQL中,我将远程查询超时设置为0。

尽管如此,仍然会出现超时。 我做错了什么?

2个回答

3

首先,我要指出在EF中进行这样大规模的单次事务上传是不正确的。此类操作应该在EF之外进行,例如将数据批量插入到临时表中,然后合并到主数据集中。

还有一种可能的情况是使用SSIS(SQL Server集成服务)。

EF不是用于数据迁移或同步的工具,在这种情况下,其性能是可悲的。


2

在using块之外读取xml文件。

建议直接使用sqlcommand插入记录。不要使用EF,因为它需要将对象翻译成记录,耗费时间。

此外,我建议使用SQLTransaction而不是使用scope。尽管scope会在底层使用sqltransaction,但是使用sqltransaction可以更好地控制事务。

我的代码如下:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接