public void PerformWork(Work work, ISessionImplementor session) { if (session.TransactionInProgress) { ITransaction transaction = ((ISession)session).Transaction; PostTransactionWorkQueueSynchronization txSync = (PostTransactionWorkQueueSynchronization) synchronizationPerTransaction[transaction]; if (txSync == null || txSync.IsConsumed) { txSync = new PostTransactionWorkQueueSynchronization(queueingProcessor, synchronizationPerTransaction); transaction.RegisterSynchronization(txSync); lock (synchronizationPerTransaction.SyncRoot) synchronizationPerTransaction[transaction] = txSync; } txSync.Add(work); } else { WorkQueue queue = new WorkQueue(2); //one work can be split queueingProcessor.Add(work, queue); queueingProcessor.PrepareWorks(queue); queueingProcessor.PerformWorks(queue); } }