【问题标题】:Common Gotchas when using TransactionScope and MS DTC使用 TransactionScope 和 MS DTC 时的常见问题
【发布时间】:2010-12-18 01:35:39
【问题描述】:

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

我认为,对于那些“奇怪的错误”情况,拥有一个综合列表将非常有用,并且可以扩展我们对平台中奇怪的知识。

关于我将如何使用事务范围的一些上下文:

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

【问题讨论】:

    标签: .net transactionscope msdtc


    【解决方案1】:

    我脑子里想的两件事:

    • 当您在同一范围内使用多个连接对象时,事务将被提升,即使这些连接具有相同的连接字符串(这在 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 实例(例如,在数据库上或在一个应用程序服务器上)并从所有应用程序服务器远程使用它,而不是每个应用程序服务器都运行它们的拥有,但我不知道这有什么额外的好处。

    【讨论】:

    • 它真的在 SQL Server 2008 中修复了吗?我正在使用 SQLS2008,当我用相同的连接字符串打开第二个连接时,事务会获得一个分布式 GUID。那么……这只是在客户端,还是真的变成了分布式事务?
    • msdn.microsoft.com/en-us/library/ms172070%28VS.90%29.aspx 我还没有为自己测试过,但根据文档,至少应该有一个合理的场景,sql 2008 的行为是这样的。也许调整您的连接字符串以明确控制池可能会有所帮助。
    • 看起来 SQL Server 2008 没有解决,看到事务提升到 DTC 具有相同的连接字符串和本地数据库
    • 如果您在关闭第一个连接之前打开第二个连接,它将升级到 SQL Server 2008 上的 DTC。如果您想避免 DTC,您必须在打开第二个连接之前关闭第一个连接(我在说关于具有相同连接字符串的连接)。
    【解决方案2】:

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

    【讨论】:

    • 不会为零;我刚刚测试了它。您可能在事务范围之前打开了连接,这意味着您的连接根本不参与事务(我刚刚学到的东西,请参阅我的帖子:stackoverflow.com/questions/2884863/…)。要么在事务范围内打开你的连接,要么通过调用 connection.EnlistTransaction(Transaction.Current) 在范围内明确登记现有事务。运行“select @@trancount”来查看它的非零值。
    【解决方案3】:

    希望有一天这会对某人有所帮助:

    如果你的 TransactionScope 里面有多个 SQL 操作,提供的 DTC 将不涉及

    1. 每个连接都使用相同的连接字符串
    2. 连接不是嵌套的。

    即打开,做某事,关闭。打开,做某事,关闭。

    现在是问题所在: 如果你曾经在你的进程中这样做(在另一个线程上)

    SqlConnection.ClearAllPools()

    这恰好发生在您的两个操作之间 - DTC 将立即参与。如果您没有运行 DTC,它将引发异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多