.net - 关于交易和 msdtc 的混淆

标签 .net winforms transactions msdtc

我对事务和 msdtc 如何协同工作有一些基本的困惑。

我有一个基本的服务器/客户端 winforms 应用程序。该应用程序使用transactionscope来封装在sql服务器上执行的多个sql命令。

当我仅在服务器上启用 msdtc 网络访问时,该应用程序似乎运行良好。然后有一天它停止工作,说网络访问未启用。

现在看来我必须在客户端计算机和服务器上启用 msdtc 网络访问才能使 transactionscope 正常工作。

客户端或服务器 msdtc 服务是否进行事务处理?或者两者皆有?

有谁能指导一下客户端和服务器是否都需要 msdtc 网络访问,还是只需要服务器?

最佳答案

如果您使用 MSDTC,那么您将需要客户端(您的应用程序)和服务器(数据库)来运行 MSDTC 并进行正确配置。

这可能是痛苦的根源,尤其是在处理防火墙时。如果您遇到问题,请参阅 Troubleshooting Problems with MSDTC 。它讨论的是 BizTalk,但一般适用于 MSDTC。 DTCPING也是你的 friend 。

现在,如果您使用 SQL Server 2005 及更高版本,仅访问一个数据库,使用一个数据库连接,并且不在应用程序域之间传递事务,那么您不应该需要使用 MSDTC。在这种情况下,System.Transactions 事务管理器将为您管理您的事务。如果发生上述任何一种情况,则该事务将提升为分布式事务(事务管理器将是 MSDTC)。请参阅Transaction Management Escalation了解更多信息。

一般来说,如果不需要,最好避免使用 MSDTC。即,如果您只处理单个 SQL Server 2005+ 数据库,则尝试将代码设计为不使用 MSDTC。除了配置麻烦之外,DTC 还会造成性能损失,因为对 MSDTC 的所有调用都在进程外,再加上两阶段提交协议(protocol)(MSDTC 使用)的开销。

就您的具体情况而言,很难说。如果您的代码没有更改,那么防火墙规则可能已更改?我还看到 Windows 更新更改了 DTC 配置(出于安全考虑),这导致了问题。

根据评论更新:

为了监视事务升级或升级,如果您没有使用任何分布式事务,我认为您可以使用一些分布式事务协调器性能计数器来跟踪已提交的事务。如果进行测试,您可以禁用 MSDTC 并查看您的代码是否失败。另一种方法是监视 SQL Server 中的事务。从编码的角度来看,您可以尝试处理 DistributedTransactionStarted事件并进行一些日志记录(但在投入生产之前删除该代码)。

有关使用单个连接的代码示例,请访问 TransactionScope MSDN 页面。基本上,创建一个 TransactionScope,创建一个 SqlConnection,使用 SqlConnection 进行一些操作,关闭连接,调用scope.Complete()。

请注意,如果您使用数据适配器方法,它们会自动管理您的连接,以便连接关闭或返回到连接池。无论哪种方式,如果调用另一个操作,则该事务将提升为 DTC 事务。请参阅System.Transactions and connection pooling了解更多详情。

关于.net - 关于交易和 msdtc 的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1564454/

相关文章:

c# - 在C#中单击按钮获取程序代码

c# - 使用 log4net 的 RichTextBoxAppender

c# - 在构造函数中更改扩展的 RichTextBox 文本不起作用

Python Google App Engine 查询内部事务没有祖先?

transactions - Redis:具有多个键的事务

c# - 数据库中数百万行,只需要这么多

.net - 自动部署 Web 应用程序?

c# - .NET 4.0 中的 CallerMemberName 不起作用

c# - 在 Windows 窗体程序为 "processing"时显示微调器,类似于 ajaxStart/ajaxStop?

java - EJB 2.0 CMP : exception scenario in multiple remove calls