可靠的测试方法,用于将MSDTC事务提升到分布式?

10

我如何可靠地检查MSDTC已经将一个事务升级为分布式事务?

这是在使用.net的TransactionScope时。

目前,一位同事正在通过关闭他机器上的协调器来测试这个问题 - 如果抛出异常,则视为已尝试升级事务。这是一个有效的测试吗?


MSDTC是一个非常稳定的产品。你确定需要测试它吗? - Steven
2
@Steven - 我需要检查交易是否被提升。情况是交易不应该被提升,但我的同事认为它们正在被提升。我们如何确定?我们如何检查交易是否被提升? - Oded
@Oded:如果不应该推广事务,为什么要使用“TransactionScope”? - Steven
1
@Steven - 应该进行事务处理,并且可以将同一连接下的多个对同一数据库的调用封装在一个事务中。然而,这样的调用(对同一数据库使用相同的连接)不应该被提升为“分布式”。我只期望跨越多个数据库的事务变成分布式。 - Oded
好的,你正在单个事务中调用同一服务器上的多个数据库。如果你无法控制(生成的)SQL(如LINQ to SQL和Entity Framework),那么在没有TransactionScope的情况下实现这一点确实很困难。 - Steven
1
@Steven - 我的问题是,在单个事务中使用相同的连接字符串调用相同的数据库,但该事务显然被提升为分布式事务,尽管它不应该。我该如何检查它是否已经被提升了? - Oded
1个回答

15

我认为你的测试还可以,不过你应该确保你得到的是一个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资源的列表。


感谢您提供详细的答案 - 您是从哪里获取这样的知识的?您能推荐一些关于MSTDC的资源吗? - Oded
1
MSDTC在运作正常时确实很棒。当它无法正常工作时,这时您可以了解到更多信息。 :) 一般来说,MSDN拥有最好的MSDTC资源。对于故障排除,通常会使用http://support.microsoft.com/kb/306843,但是这篇文章http://msdn.microsoft.com/en-us/library/aa561924%28BTS.10%29.aspx也非常好。 - Randy Levy

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