使用TransactionScope和MS DTC时的常见问题

时间:2009-11-18 21:21:11

标签: .net transactionscope msdtc

我刚刚开始使用TransactionScope,我发现总会遇到意想不到的事情需要永远调试。

我认为拥有这些的综合列表对于那些“奇怪的错误”情况非常有用,并且可以扩展我们对平台奇怪性的了解。

关于我将如何使用事务范围的一些背景信息:

  • 网络应用
  • 多个Web服务器,应用程序服务器和SQL Server
  • 事务将主要是数据库事务,但有些事务将被提升以写入MSMQ。

4 个答案:

答案 0 :(得分:3)

我头顶的两件事:

    当您在同一范围内使用多个连接对象时,
  • 事务将被提升,即使连接具有相同的连接字符串(这在sql 2008中已得到修复)。阅读更多this threaddbconnectionscope将解决sql 2005上的问题
  • msdtc实例需要能够看到对方并且需要正确设置其安全性 http://support.microsoft.com/kb/899191(允许入站和出站,不需要相互身份验证通常是最安全的选择)。使用DTCPing来解决dtc实例之间的连接问题,如下所述:http://support.microsoft.com/kb/306843

您希望事务尽可能轻量级,dtc会带来很多开销。您还希望事务尽可能短,因此仅在应用程序服务器上而不是在Web服务器上引入它们。尽可能小地在应用程序服务器和数据库之间跳过网络,通过与应用程序服务器和数据库之间不同的连接在Web和应用程序服务器之间发送网络流量,并使最后一个快速尖叫,可笑的短暂联系。

如果您有多个应用程序服务器,您可以考虑在服务器上运行单个msdtc实例(例如在数据库或其中一个应用程序服务器上),并从所有应用程序服务器远程使用它,而不是每个运行它们的服务器拥有,但我不知道这有什么额外的好处。

答案 1 :(得分:1)

另请注意,如果您在事务期间更改了任何对象,则除非您添加代码来处理此事件,否则它们将不会回滚。

请参阅 TransactionScope and rolling back object state

答案 2 :(得分:1)

希望有一天能帮到某人:

如果您的TransactionScope内部有多个SQL操作,则不会涉及DTC

  1. 您为每个连接使用相同的连接字符串
  2. 连接不是嵌套的。
  3. 即。打开,做一些,关闭。打开,做点什么,关闭。

    现在为了问题: 如果你曾经在你的过程中(在另一个线程上)这样做

    SqlConnection.ClearAllPools()

    这恰好发生在你的两次行动之间 - DTC将立即参与。如果您没有运行DTC,它将抛出异常。

答案 3 :(得分:-2)

如果您使用SQL Server并检查@@ trancount,即使您有一个活动的TransactionScope,它也将为0.