8

LINQtoSQLと分散トランザクションをサポートするサードパーティのSDKを使用しています。保留中の更新によってSQLレコードとサードパーティSDKのレコードの両方が更新されることに気付いたとき、タイムアウトが0(おそらく無限)のTransactionScopeを作成しています(ただし、タイムスパンパラメーターとして12時間を試しました)。次に、(transactionscopeによって作成された)アンビエントトランザクションでGetDtcTransactionを使用して、サードパーティのSDKにリンクするDTCトランザクションを取得します。約10分間は問題なく動作しますが、10分後にトランザクションが消え、エラーが発生します。トランザクションが消える理由を特定するにはどうすればよいですか。その時点でわずかにさまざまな程度の作業が行われているにもかかわらず、10分後に定期的に発生するため、タイムアウトであると思われます。しかし、私'

SQLプロファイラーを使用して次のイベントをトレースしてみました。

  1. すべてのエラーおよび警告イベント
  2. 「AuditSchemaObject」イベントを除くすべてのセキュリティイベント
  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イベントのEventSubClass16は、「トランザクションが中止されています」を示します。

4

3 に答える 3

9

タイムアウトを延長するには(指定されていない場合はデフォルトで最大10分)、ターゲットシステムのC:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ Machine.configを更新する必要があります(C:\ Windowsの下を見てください)。 64ビットを実行している場合は\Microsoft.NET\ Framework64 \ v2.0.50727 \ CONFIG)。ルートレベルのすぐ下の最後のアイテムとしてこれを追加します。

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

これにより、(例として)タイムアウトが23時間に設定されます。

有効な値は、System.Transactions.TransactionManager.MaximumTimeoutに表示されます

于 2009-11-19T21:52:10.207 に答える
2

分散トランザクションではなく、SqlConnectionのタイムアウトである可能性がありますか?

アップデート1

SQL Server Profilerを使用して、予期しない接続の切断を監視することができます。出力は非常に冗長になる可能性があるため、監視する必要のあるイベントのみを含めるようにトレースプロファイルに水をまくようにしてください。まず、「セキュリティ監査」イベントカテゴリにある「監査ログイン」イベントと「監査ログアウト」イベントのみを監視することから始めます。

スタンドアロン/自分だけで使用するSQLServerインスタンス以外のものをプロファイリングする場合は、ホストから発生したイベントのみが出力に表示されるように、フィルターを適用することをお勧めします。

接続文字列でタイムアウト値を明示的に指定することをお勧めします。これを実際に低く設定して、同じ動作がはるかに速くなるかどうかを確認してください。

アップデート2

トレースログから、2つの例外があります。その詳細は次のとおりです。

  • エラー:1222、重大度:16、状態:18
  • エラー:8525、重大度:16、状態:1

1222例外のグーグルはhttp://www.sqlservercentral.com/Forums/Topic579864-146-1.aspx#bm645422を表示し、次のように述べています。

このエラーは、msdbでロックが要求され、タイムアウトしたことを意味します。通常、これは、大きな一時テーブルや大きな種類、またはそのタイプの何かでの大きなトランザクションであることを意味します。

それに関連する可能性のある特に長時間実行されるクエリはありますか?おそらく、頑丈なレポート、またはそれに類似したものですか?

うまくいけば、これはあなたをもう少し遠くに連れて行きます。

于 2009-11-10T22:09:55.263 に答える
2

これはおそらく私を除いて読んでいるすべての人にとって明らかですが、私はこの問題に行き詰まり、どのように修正したかについて言及したいと思いました。BlueMonkMNで示された場所でファイルを変更したにもかかわらず、デフォルトのトランザクションタイムアウトである10分を受け取っていました。Windows 7 64ビットを実行しているため、.NETのmachine.configファイルの場所は次の場所にあります。

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

「Framework64」フォルダは上記とは異なることに注意してください。

于 2010-01-29T16:21:18.883 に答える