当前位置: 首页 > 编程语言 > C#

“TransactionInDoubtException”异常导致我的事务完整性丢失

时间:2023-04-10 23:20:34 C#

“TransactionInDoubtException”异常导致我的事务完整性丢失然后重试插入直到达到一定的阈值。这是代码:while(!SaveToDb){......Thread.Sleep(TimeSpan.FromMinutes(AppConfiguration.RetryInsertionDuringFailureIntervalInMin));}privateboolSaveToDb(){try{......using(varscope=newTransactionScope(TransactionScopeOption.Required,option)){Context.SaveEmail(_emailInfoList);上下文.SaveSyncState(syncState);范围.完成();返回真;}}赶上(异常前){...。.返回假;}}并得到了这个异常:消息:对此交易存在疑问。堆栈跟踪:System.Transactions.TransactionStatePromotedIndoubt.PromotedTransactionOutcome(InternalTransactiontx)在System.Transactions.CommittableTransaction.Commit()在System.Transactions.TransactionScope.InternalDispose()在System.Transactions.TransactionScope.Dispose()在Presensoft.Exchange2010Puch。Core.PushJob.SaveEmailAndSyncState()InnerException:System.Data.SqlClient.SqlException(0x80131904):超时已过。在操作完成之前超时期限已过或服务器未响应。—>System.ComponentModel.Win32Exception(0x80004005):在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning中等待操作超时System.Data.SqlClient.SqlInternalConnection.OnError(SqlExceptionexception,BooleanbreakConnection,Action`1wrapCloseInAction)(TdsOParserStatejeObject,布尔callerHasConnectionLock,布尔异步关闭)在System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()在System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObjectstateObj,UInt32错误)在.TdsParserStateObject.TryPrepareBuffer()atSystem.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte&value)在System.Data.SqlClient.TdsParser.TryRun(RunBehaviorrunBehavior,SqlCommandcmdHandler,SqlDataReaderdataStream,BulkCopySimpleResultSetbulkCopyHandler,TdsParserStateObjectstateObj,Boolean&dataReady)atSystem.Data.SqlClient.TdsParser.Run(RunBehaviorrunBehavior,SqlCommandcmdHandler,SqlDataReaderdataStream,BulkCopySimpleResultSet)system.Data.SqlClient.SqlInternalConnectionTds中的System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[]缓冲区,TransactionManagerRequestType请求,字符串transactionName,TransactionManagerIsolationLevelisoLevel,Int32超时,SqlInternalTransaction事务,TdsParserStateObjectstateObj,布尔值isDelegateControlRequest)中的bulkCopyHandler,TdsParserStateObjectstateObj)System.Data.SqlClient.SqlDelegatedTransaction.SinglePhaseComm中的.ExecuteTransactionYukon(TransactionRequesttransactionRequest,StringtransactionName,IsolationLeveliso,SqlInternalTransactioninternalTransaction,BooleanisDelegateControlRequest)它(SinglePhaseEnlistment登记)此应用程序Afterattemptingtoreinserttheentry,thefollowingisSystem.Data.SqlClient.SqlException(0x80131904):ViolationofPRIMARYKEYconstraint'pk_email'Itseemstomethatnotransaction.commit()wassuccessfullyinitiated(partial)commitalreadyoccurredatfirstcase(MSDTCexception),whichleadstothelatterexception.Isthereanywaytodetermineifacommitoccurredwhenthe"transactionisindoubt"exception,androllbackthecommitifitdid.根据MSDN:当尝试对有疑问的事务进行操作时会抛出此异常。当无法确定交易的状态时,交易是有疑问的。具体来说,事务的最终结果,无论是提交还是中止,对于该事务都是未知的。当尝试提交事务并且事务变为InDoubt时也会抛出此异常。这是一个可恢复的错误。编辑:对于恢复:您必须捕获TransactionInDoubtException并使用aptinspect编写补偿逻辑。使用(varscope=newTransactionScope(TransactionScopeOption.Required,option)){try{Context.SaveEmail(_emailInfoList);context.SaveSyncState(syncState);范围.完成();返回真;}catch(TransactionInDoubtExceptionex){//检查批处理中的任何一条记录是否已部分提交。如果已提交,则无需重新处理该批次。//交易范围应该首先被释放。范围.处置();如果(IsReprocessingNeeded(syncState))抛出;返回真;}}///privateboolIsReprocessingNeeded(SyncStateDataModalsyncState){while(true){try{varid=_emailInfoList[0].ID;boolisEmailsCommitted=Context.GetJournalEmail().FirstOrDefault(a=>a.ID==id)!=null;如果(!isEmailsCommitted)返回真;如果(context.EmailSynch(syncState.Id)==null){context.SaveSyncState(syncState);}返回假;}catch(Exceptionex){Thread.Sleep(TimeSpan.FromMinutes(AppConfiguration.RetryConnectionIntervalInMin));}}}消息来源TransactionInDoubtException的恢复路径是什么?以上就是C#学习教程:“TransactionInDoubtException”异常导致我的事务完整性丢失。分享的所有内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——本文来自网络收集,不代表立场,如涉及侵权请点击维权联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢