gpt4 book ai didi

c# - EntityFramework.BulkInsert 和 MSDTC

转载 作者:行者123 更新时间:2023-11-30 18:18:42 24 4
gpt4 key购买 nike

我目前正在使用 EntityFramework.BulkInsert,它被包装在一个具有事务范围的 using block 中,以生成实体的批量保存。例如

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 来确认如果连接字符串中的最大池大小设置为 X 那么perf counter NumberOfPooledConnections 反射(reflect)了相同的数字 X,当我在连接字符串中将它更改为其他内容时,这也反射(reflect)在计数器中(因此至少它按预期工作......)。其他信息 - 我正在使用集成安全性并且没有在 Enlist=... 的连接字符串中设置任何内容

批量插入包位于此处https://efbulkinsert.codeplex.com/在幕后,它看起来正在使用 sqlBulkCopy。我担心即使我无法在我的测试中重现对 MSDTC 的依赖性,即使我没有在同一事务范围内明确打开 2 个连接,但仅通过批处理的纯粹性质仍然存在对 MSDTC 的依赖性?

任何人都可以确认是或否...,谢谢。

最佳答案

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

A promotable transaction is a special form of a System.Transactions transaction that effectively delegates the work to a simple SQL Server transaction.

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

你应该没问题。

关于c# - EntityFramework.BulkInsert 和 MSDTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40732351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com