18

奇妙な問題があります。.NET プログラムがあり、プロセス ロジックには SQL Server 2005 データベースで実行時間の長いトランザクション (~20 分) が必要です。データベースに並行してアクセスする人はいないので、これで問題ありません。何か問題が発生した場合は、トランザクションをロールバックする必要があります。

まれに、目に見えるパターンがなくても、オブジェクトのRollback()操作で次のDbTransactionものがスローされSqlExceptionます。

メッセージ: 「タイムアウトの期限が切れました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。」

スタックトレース:
   System.Data.SqlClient.SqlInternalConnection.OnError (SqlException 例外、ブール値の breakConnection) で
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj) で
   System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject stateObj、UInt32 エラー) で
   System.Data.SqlClient.TdsParserStateObject.ReadSni (DbAsyncResult asyncResult、TdsParserStateObject stateObj) で
   System.Data.SqlClient.TdsParserStateObject.ReadPacket (Int32 bytesExpected) で
   System.Data.SqlClient.TdsParserStateObject.ReadBuffer() で
   System.Data.SqlClient.TdsParserStateObject.ReadByte() で
   System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj) で
   System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest (Byte[] バッファー、TransactionManagerRequestType 要求、文字列 transactionName、TransactionManagerIsolationLevel isoLevel、Int32 タイムアウト、SqlInternalTransaction トランザクション、TdsParserStateObject stateObj、ブール値 isDelegateControlRequest) で
   System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon (TransactionRequest transactionRequest、文字列 transactionName、IsolationLevel iso、SqlInternalTransaction internalTransaction、ブール値 isDelegateControlRequest) で
   System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction (TransactionRequest transactionRequest、文字列名、IsolationLevel iso、SqlInternalTransaction internalTransaction、ブール値 isDelegateControlRequest) で
   System.Data.SqlClient.SqlInternalTransaction.Rollback() で
   System.Data.SqlClient.SqlTransaction.Rollback() で

コードが機能する場合と機能しない場合があるため、それが本当にタイムアウトの問題であるかどうかはわかりません。さらに、私が知っている唯一のタイムアウトはConnectionTimeoutCommandTimeoutですが、明らかにこの場合、それらは問題ではありません。

誰かがこの問題について考えを持っていますか?

どうもありがとう、 マティアス

4

2 に答える 2

25

Sql Server チームの Matt Neerincx は、MSDN フォーラムの質問でこれに対処しました。奇妙ですが、接続文字列からの接続タイムアウトを使用してタイムアウトを設定します。ソースコードを見て彼が検証した。

于 2010-10-20T11:56:33.203 に答える
3

トランザクションのロールバックには時間がかかる場合があります。時間がかかりすぎる場合は、必ずタイムアウトになります。これに影響を与える明らかな方法はないようです-TSQLを介してトランザクションを管理してみてください-その後、(悪用)使用できます-しかし、多くの変更CommandTimeoutを行っている場合は、少し時間がかかるだけかもしれませんトランザクション内; SQL Serverは、ほとんどの処理が完了するまで実行されると想定しているため、「コミット」は事実上無料ですが、「ロールバック」はより高価です。

于 2010-10-20T11:43:09.713 に答える