10

如何可靠地检查 MSDTC 是否已将事务提升为分布式事务?

这是在 .net 中使用 TransactionScope 时。

目前,一位同事正在通过关闭他的机器上的协调器来测试这一点——如果抛出异常,这将作为尝试促进事务的证据。这是一个有效的测试吗?

4

1 回答 1

14

我认为你的测试没问题,尽管你应该确保你得到的是 DTC 异常而不是其他异常。

你可以做的其他一些事情:

  • 您还可以运行 SQL Profiler 并在事务跟踪 DTCTransaction 下运行。

  • 在代码方面,您可以处理DistributedTransactionStarted事件并在分布式事务启动时记录一条消息。

  • System.Transactions.Transaction.Current. TransactionInformation.DistributedIdentifier或者您可以在事务结束之前添加日志消息来记录。如果值为 Guid.Empty {00000000-0000-0000-0000-000000000000} 那么它不是分布式事务,否则事务已被提升为分布式事务。

您说您使用的是 SQL Server 2008。您使用的是哪个版本的 .NET?是3.5吗?如果您使用的是SQL Server 2008 和 .NET 3.5,那么您应该能够在同一个事务中打开到同一个数据库的多个连接(使用相同的连接字符串),而无需升级到分布式事务。为此,您需要在打开第二个连接之前关闭第一个连接。

如果看起来所有条件都得到满足并且交易仍在升级,我会:

  • 仔细检查 SQL Server 兼容级别
  • 检查连接字符串以查看池是否已禁用
  • 检查是否在一个事务中没有同时打开两个连接
  • 查明是否所有事务都在被提升或仅在某些情况下

更新:分布式事务协调器 (MSDTC) 和事务常见问题解答汇集了一个很好的 MSDTC 资源列表。

于 2010-03-19T16:38:12.403 回答