Dot-Net
如何確定分佈式事務超時的原因
我正在使用 LINQ to SQL 和支持分佈式事務的第三方 SDK。當我意識到掛起的更新將同時更新 SQL 記錄和第三方 SDK 中的記錄時,我正在創建一個超時為 0(可能是無限)的 TransactionScope(儘管我也嘗試了 12 小時作為時間跨度參數)。然後我在環境事務(由 transactionscope 創建)上使用 GetDtcTransaction 來獲取 DTC 事務以連結到第三方 SDK。事情執行良好大約 10 分鐘,但 10 分鐘後,事務消失並發生錯誤。我如何確定交易消失的原因。我懷疑這是一個超時,因為它經常在 10 分鐘後發生,即使此時已經完成了略有不同程度的工作。但是我'
我嘗試使用 SQL 探查器跟踪以下事件:
- 所有錯誤和警告事件
- 除“審計架構對象”事件外的所有安全事件
- 除 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 指示“事務正在中止”。
要延長超時時間(預設為 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 中可見