EntityFramework.BulkInsert和MSDTC

时间:2016-11-22 01:25:40

标签: c# asp.net asp.net-mvc-5 entity-framework-6

我目前正在使用EntityFramework.BulkInsert,它包含在具有事务范围的using块中,以生成实体的批量保存。 e.g。

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 :(得分:0)

您使用的是轻量级交易,因此它不需要MS DTC。所有工作都将由1台SQL Server机器处理。如果一个服务器启动了事务,然后另一个服务器完成其余的事务,则需要MS DTC。在你的情况下,它不是。以下是MSDN的引用:

  

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

如果需要超过1台物理计算机来执行交易,则需要MS DTC。

你应该没事。