EntityFramework.BulkInsert 和 MSDTC

3

我目前正在使用EntityFramework.BulkInsert,这是在使用块和事务范围内包装的,以产生实体的批处理保存。例如:

using(var tranScope = new TransactionScope())
{
    using(var context = new EFContext())
    {
        context.BulkInsert(entities, 100); // batching in size of 100
        context.Save();
    }
    tranScope.Complete();
}

我需要确定使用BulkInsert进行批量插入和MSDTC是否有依赖关系。我已经进行了一些测试,将最大池大小更改为各种较低和较高的数字,并在关闭MSDTC服务的情况下(目前全部在本地箱子上)使用10-100个并发用户运行负载测试。到目前为止,我无法使其抛出任何“需要打开MSDTC”的异常。我正在使用SQL2014、EF6.X和.NET 4.6、MVC 5。我理解,在这种情况下,SQL2014可能正在使用轻量级事务,我已经使用perfmon确认,如果在连接字符串中将Max Pool Size设置为X,则perf计数器NumberOfPooledConnections反映相同的数字X,当我将其更改为其他内容时,此计数器也会反映(至少按预期工作...)。其他信息-我正在使用集成安全性,并且在连接字符串中没有设置Enlist=...

批量插入包位于此处https://efbulkinsert.codeplex.com/,在幕后看起来是使用sqlBulkCopy。我担心即使我在测试中无法重现对MSDTC的依赖性,即使我没有明确在同一事务范围内打开2个连接,还是由于批处理的纯自然属性而存在MSDTC的依赖关系?

有人可以确认是否存在依赖关系吗?谢谢。

1个回答

0
你使用的是轻量级事务,因此不需要 MS DTC。 所有的工作都将由一个 SQL Server 机器处理。 如果一个服务器开始了事务并且另一个服务器完成了其余部分,则需要 MS DTC。 在你的情况下,不需要这样做。以下是来自MSDN 的一段引用:

可提升事务是 System.Transactions 事务的一种特殊形式,它有效地将工作委托给简单的 SQL Server 事务。

如果需要多个物理计算机来执行事务,则需要 MS DTC。
你应该没问题。

感谢输入,我不认为问题在于机器数量,而是连接数量和这些连接上的事务。例如,如果客户端机器具有包含事务的循环,如果在循环迭代中代码创建新的SqlConnection连接,则很可能会提升事务,如果每个新连接未明确地利用来自池中相同的连接。我的担忧在于批处理功能以及保证每个批处理将利用相同/原始连接 - 我目前并不确定,我需要保证... - dvr
这篇文章中有一些很好的例子:https://dev59.com/tuo6XIcBkEYKwwoYTzEw - dvr

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