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
-~----------~----~----~----~------~----~------~--~---