如何处理TransactionInDoubtException

我有一些简单的SELECT语句和一个包含在using(TransactionScope...)块中的INSERT 。 更新:隔离级别为ReadCommited
我在调用scope.Complete()遇到以下exception。(见下文)
同时数据库完全由另一个应用程序引起高负载。
事实上我发现INSERT语句确实执行了。

我的问题是:如何以一种使数据库保持一致状态的方式处理此exception?

我正在寻找一个总是完成或未完成但从未完成一半的交易。

exception堆栈跟踪:

 System.Transactions.TransactionInDoubtException: The transaction is in doubt. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() at System.Data.SqlClient.TdsParserStateObject.ReadByte() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlDelegatedTransaction.SinglePhaseCommit(SinglePhaseEnlistment enlistment) --- End of inner exception stack trace --- at System.Transactions.TransactionStateInDoubt.EndCommit(InternalTransaction tx) at System.Transactions.CommittableTransaction.Commit() at System.Transactions.TransactionScope.InternalDispose() at System.Transactions.TransactionScope.Dispose() 

如果不知道交易是否已完成或中止,则交易存在疑问。 数据库仍处于一致状态。 如果您遇到这样的exception,则需要访问数据库以确定是否发生了更改,但您可以确定不会看到一半的更改。

注意,我不知道如果有疑问的组件是DTC会发生什么,并且你有一个分布式事务 – 我当然希望微软能够解决这个问题,而且一个可疑的分布式事务仍然被视为一个整体。

请参阅此处:“具体而言,交易的最终结果,无论是提交还是中止,都不为此交易所知。”