Hi,

I've successfully implemented RSB+NHibernate for a project and
everything works great when I have the RSB thread count set to 1. If I
try to increase the thread count, I will eventually get an unhandled
exception from NHiberbate causing the entire application to fail
(service to stop when running as a service). The unhandled exception
is logged in the Event Log, and in my log4Net log, I get 3 errors from
NHibernate at the same time talking about a deadlock.

I am fully expecting a deadlock to occur in a mutlti-threaded
environment, and sometimes the RSB application processes several
hundread messages before crashing, other times its just a handful.
I've implemented a MessageModule to handle the NHIbernate session as
shown in Ayende's MSDN article and also as shown in a couple of posts
on this group.

I'm going to dig into this a little more, as well as make sure I'm
running the latest versions of RSB and NHibernate, but thought I would
post now to see if anyone has an idea of where I could focus my effort
in resolving this issue.

Unhandled Exception:

Application: Rhino.ServiceBus.Host.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.InvalidOperationException
Stack:
   at NHibernate.AdoNet.ConnectionManager.Disconnect()
   at NHibernate.AdoNet.ConnectionManager.Close()
   at NHibernate.Impl.SessionImpl.Close()
   at NHibernate.Impl.SessionImpl.Dispose(Boolean)
   at
NHibernate.Impl.SessionImpl.CloseSessionFromDistributedTransaction()
   at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory
+<>c__DisplayClass1.<EnlistInDistributedTransactionIfNeeded>b__0(System.Object,
System.Transactions.TransactionEventArgs)
   at
System.Transactions.TransactionCompletedEventHandler.Invoke(System.Object,
System.Transactions.TransactionEventArgs)
   at
System.Transactions.TransactionStatePromotedAborted.EnterState(System.Transactions.InternalTransaction)
   at
System.Transactions.InternalTransaction.DistributedTransactionOutcome(System.Transactions.InternalTransaction,
System.Transactions.TransactionStatus)
   at
System.Transactions.Oletx.RealOletxTransaction.FireOutcome(System.Transactions.TransactionStatus)
   at
System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcomeFunction(System.Transactions.TransactionStatus)
   at
System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object,
Boolean)
   at
System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object,
Boolean)



Errors in log4net Logging, which I expect, and also get sometimes w/o
the whole application crashing.


2011-02-01 11:28:20,499 [18] WARN
NHibernate.Util.ADOExceptionReporter [(null)] -
System.Data.SqlClient.SqlException (0x80131904): Transaction (Process
ID 59) was deadlocked on lock resources with another process and has
been chosen as the deadlock victim. Rerun the transaction.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException
exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,
SqlCommand cmdHandler, SqlDataReader dataStream,
BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
stateObj)
   at
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,
RunBehavior runBehavior, String resetOptionsString)
   at
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean
async)
   at
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
method, DbAsyncResult result)
   at
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult
result, String methodName, Boolean sendToPipe)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery()
   at NHibernate.AdoNet.SqlClientSqlCommandSet.ExecuteNonQuery() in d:
\CSharp\NH\nhibernate\src\NHibernate\AdoNet
\SqlClientSqlCommandSet.cs:line 117
   at
NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand
ps) in d:\CSharp\NH\nhibernate\src\NHibernate\AdoNet
\SqlClientBatchingBatcher.cs:line 91
2011-02-01 11:28:20,570 [18] ERROR
NHibernate.Util.ADOExceptionReporter [(null)] - Transaction (Process
ID 59) was deadlocked on lock resources with another process and has
been chosen as the deadlock victim. Rerun the transaction.
2011-02-01 11:28:20,574 [18] ERROR
NHibernate.Event.Default.AbstractFlushingEventListener [(null)] -
Could not synchronize database state with session
NHibernate.Exceptions.GenericADOException: could not execute batch
command.[SQL: SQL not available] --->
System.Data.SqlClient.SqlException: Transaction (Process ID 59) was
deadlocked on lock resources with another process and has been chosen
as the deadlock victim. Rerun the transaction.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException
exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,
SqlCommand cmdHandler, SqlDataReader dataStream,
BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
stateObj)
   at
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,
RunBehavior runBehavior, String resetOptionsString)
   at
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean
async)
   at
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
method, DbAsyncResult result)
   at
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult
result, String methodName, Boolean sendToPipe)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery()
   at NHibernate.AdoNet.SqlClientSqlCommandSet.ExecuteNonQuery() in d:
\CSharp\NH\nhibernate\src\NHibernate\AdoNet
\SqlClientSqlCommandSet.cs:line 117
   at
NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand
ps) in d:\CSharp\NH\nhibernate\src\NHibernate\AdoNet
\SqlClientBatchingBatcher.cs:line 91
   --- End of inner exception stack trace ---
   at
NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand
ps) in d:\CSharp\NH\nhibernate\src\NHibernate\AdoNet
\SqlClientBatchingBatcher.cs:line 103
   at
NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand
ps) in d:\CSharp\NH\nhibernate\src\NHibernate\AdoNet
\AbstractBatcher.cs:line 431
   at NHibernate.AdoNet.AbstractBatcher.ExecuteBatch() in d:\CSharp\NH
\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line 416
   at NHibernate.AdoNet.AbstractBatcher.OnPreparedCommand() in d:
\CSharp\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line
168
   at NHibernate.AdoNet.AbstractBatcher.PrepareCommand(CommandType
type, SqlString sql, SqlType[] parameterTypes) in d:\CSharp\NH
\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line 155
   at
NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
Object[] fields, Object[] oldFields, Object rowId, Boolean[]
includeProperty, Int32 j, Object oldVersion, Object obj,
SqlCommandInfo sql, ISessionImplementor session) in d:\CSharp\NH
\nhibernate\src\NHibernate\Persister\Entity
\AbstractEntityPersister.cs:line 2722
   at
NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object
id, Object[] fields, Object[] oldFields, Object rowId, Boolean[]
includeProperty, Int32 j, Object oldVersion, Object obj,
SqlCommandInfo sql, ISessionImplementor session) in d:\CSharp\NH
\nhibernate\src\NHibernate\Persister\Entity
\AbstractEntityPersister.cs:line 2689
   at
NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection,
Object[] oldFields, Object oldVersion, Object obj, Object rowId,
ISessionImplementor session) in d:\CSharp\NH\nhibernate\src\NHibernate
\Persister\Entity\AbstractEntityPersister.cs:line 2965
   at NHibernate.Action.EntityUpdateAction.Execute() in d:\CSharp\NH
\nhibernate\src\NHibernate\Action\EntityUpdateAction.cs:line 79
   at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in
d:\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 136
   at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d:
\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 126
   at NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH
\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 170
   at
NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource
session) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default
\AbstractFlushingEventListener.cs:line 241

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