Ho creato un servizio WCM MSMQ che è transazionale. Ho utilizzato il seguente attributo sulla mia operazione:WCF msmq transazione e unità di lavoro
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
Sto utilizzando Nhibere in servizio. Utilizzando Nhibernate, eseguo un commit sulla mia sessione. Se disattivo il commit di Nhibernate, il messaggio viene elaborato e rimosso correttamente dalle code. Con questo commit, la transazione Nhibernate viene eseguita correttamente ma il mio messaggio viene inserito nella coda dei tentativi.
Ecco l'eccezione che si ottiene nella traccia del servizio Nhibernate.
Description Handling an exception. Exception details: System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Transaction'.
at System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)
at System.Transactions.TransactionScope.SetCurrent(Transaction newCurrent)
at System.Transactions.TransactionScope.PushScope()
at System.Transactions.TransactionScope.Initialize(Transaction transactionToUse, TimeSpan scopeTimeout, Boolean interopModeSpecified)
at System.Transactions.TransactionScope..ctor(Transaction transactionToUse, TransactionScopeAsyncFlowOption asyncFlowOption)
at System.Transactions.TransactionScope..ctor(Transaction transactionToUse)
at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)
--- End of inner exception stack trace ---
at System.Transactions.TransactionStatePromotedAborted.PromotedTransactionOutcome(InternalTransaction tx)
at System.Transactions.TransactionStatePromotedEnded.EndCommit(InternalTransaction tx)
at System.Transactions.CommittableTransaction.Commit()
at System.ServiceModel.Dispatcher.TransactionInstanceContextFacet.Complete(Transaction transaction, Exception error)
Sembra che il commit nhibernate distrugga la transazione su WCF. Non riesco a trovare il modo di risolvere questo problema.
Qualsiasi aiuto può essere apprezzato
Stai chiamando NH sync o async (TPL?)? –
All'interno del servizio WCF è sincronizzato. (Chiamata WCF, chiamata alla classe di backend -> chiamata al repository). Tutto nella classe di backend è in una transazione NH completa. – Patrick
Hai provato questa risposta: http://stackoverflow.com/questions/4930175/nhibernate-with-transactionscope-error-dtc-transaction-prepre-phase-failed ? – miensol