代码之家  ›  专栏  ›  技术社区  ›  BlueMonkMN

如何确定分布式事务超时的原因

  •  8
  • BlueMonkMN  · 技术社区  · 16 年前

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

    我已尝试使用SQL事件探查器跟踪以下事件:

    1. 所有错误和警告事件
    2. 除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>
    

    3 回复  |  直到 16 年前
        1
  •  9
  •   BlueMonkMN    8 年前

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

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

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

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

        2
  •  2
  •   Yoopergeek    16 年前

    更新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中请求并超时。 大临时表上的大事务或 一种大的,或者类似的东西。

    你有什么特别的建议吗 那个

    希望这能让你走得更远一点。

        3
  •  2
  •   yanigisawa    16 年前

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

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

    注意“Framework64”文件夹与上面的不同。

    推荐文章