この投稿の根底にある質問は、「プロモーションされていない LTM トランザクションが疑わしいのはなぜですか?」ということです。
System.Transactions.TransactionInDoubtException が発生しましたが、その理由を説明できません。残念ながら、この問題を再現することはできませんが、トレース ファイルによると発生します。私は SQL 2005 を使用しており、1 つのデータベースに接続し、1 つの SQLConnection を使用しているため、プロモーションが行われるとは考えていません。エラー メッセージはタイムアウトを示します。ただし、タイムアウト メッセージが表示されることもありますが、例外は、トランザクションが未確定ではなく中止されたことです。これは、処理がはるかに簡単です。
完全なスタック トレースは次のとおりです。
System.Transactions.TransactionInDoubtException: トランザクションは未確定です。---> System.Data.SqlClient.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.ReadNetworkPacket() で 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.SqlDelegatedTransaction.SinglePhaseCommit (SinglePhaseEnlistment 参加) で --- 内部例外スタック トレースの終了 --- System.Transactions.TransactionStateInDoubt.EndCommit (InternalTransaction tx) で System.Transactions.CommittableTransaction.Commit() で System.Transactions.TransactionScope.InternalDispose() で System.Transactions.TransactionScope.Dispose() で
何か案は?なぜ私は doubpt に入ってしまったのでしょうか?
詳細については編集
私は実際にはまだこれに対する答えを持っていません。私が気付いたのは、トランザクションが実際には部分的にコミットされているということです。1 つのテーブルは挿入されますが、もう 1 つのテーブルは更新されません。コードは非常にトレースされており、何かを見逃す余地はあまりありません。
取引が促進されたかどうかを簡単に確認できる方法はありますか。スタック トレースから確認できますか? SIngle フェーズ コミット (strack トレースにあります) は、昇進していないことを示しているようですが、何かが足りないのかもしれません。昇進していない場合、どうして疑わしいのでしょうか。
パズルのもう 1 つの興味深いピースは、現在のトランザクションのクローンを作成することです。この問題の回避策としてこれを行います。 http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=914869&SiteID=1
残念ながら、この問題が解決したかどうかはわかりません。クローンの作成が問題を引き起こしている可能性があります。ここに関連するコードがあります
using (TransactionScope ts = new TransactionScope())
{
transactionCreated = true;
//part of the workarround for microsoft defect mentioned in the beginning of this class
Transaction txClone = Transaction.Current.Clone();
transactions[txClone] = txClone;
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(TransactionCompleted);
MyTrace.WriteLine("Transaction clone stored and attached to event");
m_dataProvider.PersistPackage(ControllerID, package);
MyTrace.WriteLine("Package persisted");
m_dataProvider.PersistTransmissionControllerStatus(this);
MyTrace.WriteLine("Transmission controlled updated");
ts.Complete();
}
ありがとう