【问题标题】:How to determine why a distributed transaction is timing out如何确定分布式事务超时的原因
【发布时间】:2009-11-10 22:06:24
【问题描述】:

我正在使用 LINQ to SQL 和支持分布式事务的第三方 SDK。当我意识到挂起的更新将同时更新 SQL 记录和第三方 SDK 中的记录时,我正在创建一个超时为 0(可能是无限)的 TransactionScope(尽管我也尝试了 12 小时作为时间跨度参数)。然后我在环境事务(由 transactionscope 创建)上使用 GetDtcTransaction 来获取 DTC 事务以链接到第三方 SDK。事情运行良好大约 10 分钟,但 10 分钟后,事务消失并发生错误。我如何确定交易消失的原因。我怀疑这是一个超时,因为它经常在 10 分钟后发生,即使此时已经完成了稍微不同程度的工作。但是我不知道如何确定是什么终止了交易,为什么以及如何延长它的寿命。

我尝试使用 SQL 分析器跟踪以下事件:

  1. 所有错误和警告事件
  2. 除“审计架构对象”事件之外的所有安全事件
  3. 除 SQLTransaction 和 TransactionLog 事件之外的所有事务事件

我在错误发生时得到的只是这些事件:

<Event id="19" name="DTCTransaction">
  <Column id="3" name="DatabaseID">1</Column>
  <Column id="11" name="LoginName">sa</Column>
  <Column id="35" name="DatabaseName">master</Column>
  <Column id="51" name="EventSequence">167065</Column>
  <Column id="12" name="SPID">10</Column>
  <Column id="60" name="IsSystem">1</Column>
  <Column id="1" name="TextData">{D662BBC4-21EC-436D-991C-DCB061A34782}</Column>
  <Column id="21" name="EventSubClass">16</Column>
  <Column id="25" name="IntegerData">0</Column>
  <Column id="41" name="LoginSid">01</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="2" name="BinaryData">C4BB62D6EC216D43991CDCB061A34782</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:32.82-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="50" name="XactSequence">0</Column>
</Event>
<Event id="33" name="Exception">
  <Column id="3" name="DatabaseID">9</Column>
  <Column id="11" name="LoginName">sa</Column>
  <Column id="31" name="Error">1222</Column>
  <Column id="35" name="DatabaseName">ACS</Column>
  <Column id="51" name="EventSequence">167066</Column>
  <Column id="12" name="SPID">19</Column>
  <Column id="20" name="Severity">16</Column>
  <Column id="60" name="IsSystem">1</Column>
  <Column id="1" name="TextData">Error: 1222, Severity: 16, State: 18</Column>
  <Column id="41" name="LoginSid">01</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:34.717-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="30" name="State">18</Column>
  <Column id="50" name="XactSequence">0</Column>
</Event>
<Event id="33" name="Exception">
  <Column id="31" name="Error">8525</Column>
  <Column id="8" name="HostName">MARTY755</Column>
  <Column id="12" name="SPID">55</Column>
  <Column id="20" name="Severity">16</Column>
  <Column id="64" name="SessionLoginName">fse</Column>
  <Column id="1" name="TextData">Error: 8525, Severity: 16, State: 1</Column>
  <Column id="9" name="ClientProcessID">2516</Column>
  <Column id="41" name="LoginSid">DB2744F54B5CDB4A8B9E5CA9C209A7AC</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="10" name="ApplicationName">.Net SqlClient Data Provider</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:37.54-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="30" name="State">1</Column>
  <Column id="50" name="XactSequence">236223201284</Column>
  <Column id="3" name="DatabaseID">9</Column>
  <Column id="11" name="LoginName">fse</Column>
  <Column id="35" name="DatabaseName">ACS</Column>
  <Column id="51" name="EventSequence">167067</Column>
</Event>
<Event id="162" name="User Error Message">
  <Column id="31" name="Error">8525</Column>
  <Column id="8" name="HostName">MARTY755</Column>
  <Column id="12" name="SPID">55</Column>
  <Column id="20" name="Severity">16</Column>
  <Column id="64" name="SessionLoginName">fse</Column>
  <Column id="1" name="TextData">Distributed transaction completed. Either enlist this session in a new transaction or the NULL transaction.</Column>
  <Column id="9" name="ClientProcessID">2516</Column>
  <Column id="41" name="LoginSid">DB2744F54B5CDB4A8B9E5CA9C209A7AC</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="10" name="ApplicationName">.Net SqlClient Data Provider</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:37.54-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="30" name="State">1</Column>
  <Column id="50" name="XactSequence">236223201284</Column>
  <Column id="3" name="DatabaseID">9</Column>
  <Column id="11" name="LoginName">fse</Column>
  <Column id="35" name="DatabaseName">ACS</Column>
  <Column id="51" name="EventSequence">167068</Column>
</Event>

DTCTransaction 事件上的 EventSubClass 16 指示“事务正在中止”。

【问题讨论】:

    标签: .net vb.net sql-server-2005 linq-to-sql msdtc


    【解决方案1】:

    要延长超时时间,默认为 10 分钟,未指定时最长,需要更新目标系统上的 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\Machine.config(查看 C :\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG 如果您运行的是 64 位)。将此添加为根级别下的最后一项:

    <system.transactions>
        <machineSettings maxTimeout="23:00:00"/>
    </system.transactions>
    

    这将(例如)将超时设置为 23 小时。

    有效值在 System.Transactions.TransactionManager.MaximumTimeout 中可见

    【讨论】:

    • 我现在发现自己遇到了这个问题。哈!我只是想补充一点,这个最大超时只能在 machine.config 中设置——你不能在你的 app.config 中覆盖它。如果不允许修改目标部署平台的 machine.config,这是一个真正的限制。
    • 是的,这似乎是设计使然...但同意您的观点,当您不允许更新服务器时,这并不是那么有趣...
    【解决方案2】:

    可能是 SqlConnection 超时而不是分布式事务?

    更新 1

    您可以使用SQL Server Profiler 尝试监控意外的连接中断。您只需要确保您的跟踪配置文件只包含您需要监控的事件,因为它的输出可能非常冗长。我首先只监视可以在“安全审计”事件类别下找到的“审计登录”和“审计注销”事件。

    如果您要分析的不是独立/仅供您自己使用的 SQL Server 实例,您可能需要应用过滤器,以便只有源自您的主机的事件才会显示在输出中。

    您可能想要明确地specify a timeout value in your connection string - 将其设置得非常低,看看您是否能更快地获得相同的行为。

    更新 2

    从您的跟踪日志中,我看到两个异常,其详细信息是:

    • 错误:1222,严重性:16,状态:18
    • 错误:8525,严重性:16,状态:1

    1222 异常的谷歌搜索出现了http://www.sqlservercentral.com/Forums/Topic579864-146-1.aspx#bm645422,其中指出:

    那个错误意味着锁是 在 msdb 中请求并超时。 通常,这意味着它是一个 大临时表上的大事务或 一大类,或者那种类型的东西。

    你有什么特别的 可能是长时间运行的查询 与它有关吗?也许是沉重的 值班报告,或类似的东西 那个?

    希望这能让你走得更远。

    【讨论】:

    • 我如何确定这一点——我可以做一些跟踪来跟踪超时吗?
    • 我已经尝试过使用 SQL Server Profiler 来监控事务事件和错误,但它似乎没有太大帮助。我看到没有提到超时。也许我只是在监视错误的事件?
    • 我确实有一个长时间运行的查询......我想弄清楚的是如何让它继续运行。
    • 实际上,这不是一个长时间运行的查询,而是同一事务中的大量操作。
    • 我一直在抓稻草,在这一点上我已经花了很多时间......也许对你的问题给予赏金以尝试吸引更好的答案?
    【解决方案3】:

    这对于除了我之外的每个阅读者来说可能都很明显,但我只是陷入了这个问题并想提一下我是如何解决它的。即使我在 BlueMonkMN 指示的位置修改了文件,我仍然收到 10 分钟的默认事务超时。由于我运行的是 Windows 7 64 位,.NET 的 machine.config 文件位置位于以下位置:

    C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG

    请注意,“Framework64”文件夹与上述不同。

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多