为什么在EF Code First应用中使用TransactionScope时会尝试使用MSDTC?

7
我刚刚向一个使用EF 4.3 Code First针对SQL 2010 Express本地数据库的MVC3应用程序介绍了TransactionScope的用法。当我在作用域内尝试保存更改时,我收到一个“提供程序无法打开”的通知,并且有一个关于缺少MSDTC的内部异常。据我所知,只有在使用多个连接字符串时才会发生这种情况。我仅仅使用与一个数据库的连接,在应用程序中只有1个字符串。然而,我使用了几个DbContext实例,但是跨事务范围只使用了一个。
关于如何解决这个问题,您有什么建议吗?
3个回答

4

1
第一次应用程序调用EF时,它将进行初始化(如果不存在,它将构建数据库等)。如果此第一次调用在TransactionScope内部,则会升级为DTC。
要解决此问题,请在应用程序启动方法中调用EF,这将确保EF在TransactionScope之外进行初始化。从现在开始,您可以在TransactionScope内包含一个或多个对EF的调用,并且只要: a)始终使用完全相同的连接字符串,并且 b)您正在使用Sql Server 2008及更高版本(您正在使用)。

这在 EFCore anno 2020 中似乎是正确的。在一个 instance-per-request 架构中,我发现我的 unitofwork 实例无缘无故地进行了 DTC 提升,通过在 TransactionScope 前添加一个小查询,它停止了提升... - Thomas

0

我认为如果你有一个事务范围并打开两个单独的连接,即使它们是到具有相同连接字符串的同一数据库,你会发现该事务将被提升为分布式事务。

http://www.bomisofmab.com/blog/?p=184 充分描述了这种情况。


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