.NET TransactionScope超时问题/ EF

时间:2011-10-11 13:18:39

标签: .net entity-framework transactions transactionscope

我有一个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 个答案:

答案 0 :(得分:3)

我首先要指出,在EF的单一交易中进行如此大规模的上传是错误的。此类操作应在EF之外完成,例如将批量插入临时表并合并到主数据集。

SSIS(SQL Server集成服务)也可能出现这种情况。

EF不是数据迁移或同步的工具,它在这种情况下的表现是悲剧性的。

答案 1 :(得分:2)

在使用块之外读取xml文件。

我建议直接使用sqlcommand来插入记录。不要使用EF,因为它需要花时间将对象转换为记录。

另外,我会使用SQLTransaction而不是scope。虽然,scope会在下面使用sqltransaction,但你可以使用sqltrasnaction获得更多控制权。

我的代码看起来像