如果您使用 MSDTC,那么您将需要客户端(您的应用程序)和服务器(数据库)来运行 MSDTC 并进行正确配置。
这可能是痛苦的根源,尤其是在处理防火墙时。如果您遇到问题请参阅解决 MSDTC 问题 http://msdn.microsoft.com/en-us/library/aa561924%28BTS.20%29.aspx。它讨论的是 BizTalk,但一般适用于 MSDTC。也是你的朋友。
现在,如果您使用 SQL Server 2005 及更高版本,仅访问一个数据库,使用一个数据库连接,并且不在应用程序域之间传递事务,那么您不应要求使用 MSDTC。在这种情况下,System.Transactions 事务管理器将为您管理您的事务。如果发生上述任何一种情况,则该事务将提升为分布式事务(事务管理器将是 MSDTC)。看交易管理升级 http://msdn.microsoft.com/en-us/library/ms229978.aspx了解更多信息。
一般来说,如果不需要,最好避免使用 MSDTC。即,如果您只处理单个 SQL Server 2005+ 数据库,则尝试将代码设计为不使用 MSDTC。除了配置麻烦之外,DTC 还会造成性能损失,因为对 MSDTC 的所有调用都在进程外,再加上两阶段提交协议(MSDTC 使用的)的开销。
就您的具体情况而言,很难说。如果您的代码没有更改,那么防火墙规则可能已更改?我还看到 Windows 更新更改了 DTC 配置(出于安全考虑),这导致了问题。
根据评论更新:
为了监视事务升级或升级,如果您没有使用任何分布式事务,我认为您可以使用一些分布式事务协调器性能计数器来跟踪已提交的事务。如果进行测试,您可以禁用 MSDTC 并查看您的代码是否失败。另一种方法是监视 SQL Server 中的事务。从编码的角度来看,您可以尝试处理分布式事务开始 http://msdn.microsoft.com/en-us/library/system.transactions.transactionmanager.distributedtransactionstarted.aspx事件并进行一些日志记录(但在投入生产之前删除该代码)。
有关使用单个连接的代码示例,请访问交易范围 http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspxMSDN 页面。基本上,创建一个 TransactionScope,创建一个 SqlConnection,使用 SqlConnection 进行一些操作,关闭连接,调用scope.Complete()。
请注意,如果您使用数据适配器方法,它们会自动管理您的连接,以便连接关闭或返回到连接池。无论哪种方式,如果调用另一个操作,则该事务将提升为 DTC 事务。看System.Transactions 和连接池 http://www.softinsight.com/bnoyes/2005/09/14/SystemTransactionsAndConnectionPooling.aspx更多细节。