Keeping in mind this crazy issue:
http://groups.google.ru/group/nhibernate-development/browse_thread/thread/d3b5413d3ddbdfe7
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
-~----------~----~----~----~------~----~------~--~---