Apparently System.Transactions is doing something behind the scenes like rolling back timed out transactions every now and then. But dotConnect throws an exception when Rollback is called and the connection is in invalid state (i.e, session is killed or tcp connection to Oracle server is closed):
We have no control over System.Transactions behavior, so we can't handle exceptions dotConnect is throwing on a worker thread taken from the thread pool. How do we prevent the application from crashing in such a condition?Message: ORA-03113: end-of-file on communication channel
at Devart.Data.Oracle.c2.a(Byte[] A_0, Int32 A_1, Int32 A_2)
at Devart.Data.Oracle.c2.a(Byte& A_0)
at Devart.Data.Oracle.cw.b(Byte[] A_0, Int32 A_1, Int32 A_2)
at Devart.Data.Oracle.cw.f()
at Devart.Data.Oracle.cp.c()
at Devart.Data.Oracle.as.c()
at Devart.Data.Oracle.OracleInternalConnection.Rollback()
at Devart.Common.r.b(Enlistment A_0)
at System.Transactions.VolatileEnlistmentAborting.EnterState(InternalEnlistment enlistment)
at System.Transactions.TransactionStateAborted.EnterState(InternalTransaction tx)
at System.Transactions.EnlistableStates.Timeout(InternalTransaction tx)
at System.Transactions.Bucket.TimeoutTransactions()
at System.Transactions.BucketSet.TimeoutTransactions()
at System.Transactions.TransactionTable.ThreadTimer(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()