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

Blu*_*kMN 8 .net vb.net msdtc sql-server-2005 linq-to-sql

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

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

  1. 所有错误和警告事件
  2. 除"审核模式对象"事件之外的所有安全事件
  3. 除SQLTransaction和TransactionLog事件之外的所有Transaction事件

所有我在错误发生时都会遇到以下事件:

<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>
Run Code Online (Sandbox Code Playgroud)

DTCTransaction事件的EventSubClass 16表示"交易正在中止".

Blu*_*kMN 8

要延长超时(未指定时默认为最多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>
Run Code Online (Sandbox Code Playgroud)

这将(作为示例)将超时设置为23小时.

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

  • 我现在发现自己遇到了这个问题.哈!我只是想补充一点,这个最大超时只能在machine.config中设置 - 你不能在app.config中覆盖它.如果不允许您修改目标部署平台的machine.config,则这是一个真正的限制. (2认同)