我如何可靠地检查MSDTC已经将一个事务升级为分布式事务?
这是在使用.net的TransactionScope时。
目前,一位同事正在通过关闭他机器上的协调器来测试这个问题 - 如果抛出异常,则视为已尝试升级事务。这是一个有效的测试吗?
我如何可靠地检查MSDTC已经将一个事务升级为分布式事务?
这是在使用.net的TransactionScope时。
目前,一位同事正在通过关闭他机器上的协调器来测试这个问题 - 如果抛出异常,则视为已尝试升级事务。这是一个有效的测试吗?
我认为你的测试还可以,不过你应该确保你得到的是一个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,那么你应该能够在同一事务中对同一数据库打开多个连接(使用相同的连接字符串)而不升级为分布式事务。为了使其工作,你需要在打开第二个连接之前关闭第一个连接。
如果似乎符合了所有条件,事务仍然升级,那么我会:
更新: 分布式事务处理协调员(MSDTC)及其常见问题解答 收集了大量MSDTC资源的列表。
TransactionScope
的情况下实现这一点确实很困难。 - Steven