2014-05-01 14 views
24

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

+1

Stai chiamando NH sync o async (TPL?)? –

+0

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

+0

Hai provato questa risposta: http://stackoverflow.com/questions/4930175/nhibernate-with-transactionscope-error-dtc-transaction-prepre-phase-failed ? – miensol

risposta

1

Io non sono troppo familiarità con questi sistemi, ma la risposta più semplice è di solito quella giusta, così ho deciso di dargli un colpo - a occhio e croce, direi che qualunque servizio tu chiami gli elementi sta fermando il processo che rimuove gli elementi prima che abbia la possibilità di rimuoverli, quindi aggiungerei una sorta di chiamata di funzione nel servizio a cui stai chiamando gli elementi in modo che sia costretto a rimuovere l'elemento dall'elenco prima che possa completare la transazione.

Naturalmente, non ho familiarità con questo argomento, quindi non credetemi, è solo in generale quello che farei per un problema simile entro i limiti della mia conoscenza di programmazione.