It'd be cool in the light of the NHibernate + DTC issue

On 21 окт, 23:29, Ayende Rahien <[email protected]> wrote:
> We can probably offer another event, before we commit the DTC
>
> On Wed, Oct 21, 2009 at 7:26 PM, Vadim Kantorov 
> <[email protected]>wrote:
>
>
>
>
>
> > Keeping in mind this crazy issue:
>
> >http://groups.google.ru/group/nhibernate-development/browse_thread/th...
> > I tried to use native NH transactions everywhere just in case. I
> > thought creating a message module would be a solution.
> > Unfortunately, my module doesn't work correctly.
>
> > public class NhMessageModule : IMessageModule
> >        {
> >        readonly ISessionFactory factory;
>
> >                public NhMessageModule(ISessionFactory factory)
> >                {
> >                        this.factory = factory;
> >                }
>
> >                public void Init(ITransport transport)
> >                {
> >                        transport.MessageArrived += OpenSession;
> >                        transport.MessageProcessingCompleted +=
> > DisposeOfSession;
> >                }
>
> >                public void Stop(ITransport transport)
> >                {
> >                        transport.MessageArrived -= OpenSession;
> >                        transport.MessageProcessingCompleted -=
> > DisposeOfSession;
> >                }
>
> >                private bool OpenSession(CurrentMessageInformation arg)
> >                {
> >                        var session = factory.OpenSession();
> >                        session.BeginTransaction();
>
> >                        CurrentSessionContext.Bind(session);
>
> >                        return false;
> >                }
>
> >                private void DisposeOfSession(CurrentMessageInformation
> > arg1,
> > Exception arg2)
> >                {
>
> >                        if (CurrentSessionContext.HasBind(factory))
> >                        {
> >                                var session =
> > CurrentSessionContext.Unbind(factory);
>
> >                                if (session.Transaction != null &&
> > session.Transaction.IsActive)
> >                                        session.Transaction.Commit();
>
> >                                session.Dispose();
> >                        }
> >                }
> >        }
>
> > It fails with an SqlException
> > Message: The COMMIT TRANSACTION request has no corresponding BEGIN
> > TRANSACTION.
> > Stack trace:
> >   at System.Data.SqlClient.SqlConnection.OnError(SqlException
> > exception, Boolean breakConnection)
> >   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
> > exception, Boolean breakConnection)
> >   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning
> > (TdsParserStateObject stateObj)
> >   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.SqlInternalTransaction.Commit()
> >   at System.Data.SqlClient.SqlTransaction.Commit()
> >   at NHibernate.Transaction.AdoTransaction.Commit()
>
> > As I found out  it stems from the fact that the distributed
> > transaction (in which RSB encloses every message handling) gets
> > disposed before the MessageProcessionCompleted event is fired.
>
> > Any other way to enclose every message handling into an NH
> > transaction? Do you think this RSB behavior should be changed?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Rhino Tools Dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rhino-tools-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to