什么服务器属性使 TransactionScope 升级到 MSDTC?

Jon*_*röm 7 sql-server sql-server-2008-r2 transaction c#

在我们的应用程序中,我们使用的是 TransactionScope。我们的目标是不使用 MSDTC 服务,因为它比轻量级事务慢很多。

using (var transactionScope = new TransactionScope())
{
  ...
  transactionScope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

当连接到测试数据库时,我们不需要 MSDTC,但在同一台机器上执行的完全相同的代码在连接到生产或开发数据库时升级为使用 MSDTC。

开发数据库不是集群的,也不是命名实例。

所有都是 SQL Server 2008 (10.50.2500) 并且连接字符串完全相同,除了主机名。

数据库的设置似乎必须有所不同。关于这可能是什么的任何想法?

编辑

该事务用于保护两个不同表中的插入。我注意到还有两个调用导致了两个选择。这些不需要在交易中,所以我将它们移到了它之外。然后,所有三个数据库中都不再需要 MSDTC。问题解决了,但不知道是什么原因造成的。

小智 5

以下是您可以尝试使其正常工作的一些方法:

  • Enlist=false在您的连接字符串中进行比较
  • MultipleActiveResultSets=true在您的连接字符串中进行比较
  • 出于某种原因,用户实例数据库的工作方式似乎有所不同——我们无法让它与它们一致地工作——始终使用完整的数据库
  • 您可以重用同一个连接(关闭/重新打开),或在一个 中使用多个连接TransactionScope,但不能同时使用多个连接。但是,您可以保持ThreadStatic连接并传递它(或者,正如我们所做的那样,ThreadLocal<>在 db 包装器类中使用)-这为我们解决了 ASP.NET 中导致不必要升级的并发问题
  • 如果您的 db < 2008 或兼容性级别 < 100,请不要打扰
  • 使用连接字符串时,不要使用ConnectionString另一个连接的属性来创建你的新连接——它可能和原来的不一样,这会导致升级
  • 仅在需要时保持连接打开,并尽早关闭它们。

我发现有用的东西: