Por favor, não esqueça de upvote oq e um .. obrigado \ Hibernate 4.1.9 (última versão final) relatando 'transações aninhadas não suportadas

Estou recebendo um

org.hibernate.TransactionException: nested transactions not supported
at    org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152)
at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1395)
at com.mcruiseon.server.hibernate.ReadOnlyOperations.flush(ReadOnlyOperations.java:118)

Código que lança essa exceção. Estou chamando flush de um thread que é executado infinitamente até que haja dados para liberar.

public void flush(Object dataStore) throws DidNotSaveRequestSomeRandomError {
    Transaction txD;
    Session session;
    session = currentSession();
    // Below Line 118 
    txD = session.beginTransaction();
    txD.begin() ;
    session.saveOrUpdate(dataStore);
    try {
        txD.commit();
        while(!txD.wasCommitted()) ;
    } catch (ConstraintViolationException e) {
        txD.rollback() ;
        throw new DidNotSaveRequestSomeRandomError(dataStore, feedbackManager);
    } catch (TransactionException e) {
        txD.rollback() ;
    }  finally {
        // session.flush();
        txD = null;
        session.close();
    }
    // mySession.clear();
}

Edit: Eu estou chamando flush em um thread independente como lista de dados contém dados. Pelo que eu vejo é uma chamada de operação de sincronização para liberar, então idealmente liberar não deve retornar até que a transação seja concluída. Eu gostaria que desse jeito é o mínimo que eu quero esperar. Desde que é um thread independente fazendo o seu trabalho, tudo o que eu me importo é que seja uma operação de sincronização. Agora minha pergunta é, txD.com é uma operação assíncrona? Retorna antes que a transação tenha a chance de terminar. Se sim, existe uma maneira de se comprometer com "Aguarde" até que a transação seja concluída?

        public void run() {
        Object dataStore = null;
        while (true) {
            try {
                synchronized (flushQ) {
                    if (flushQ.isEmpty())
                        flushQ.wait();
                    if (flushQ.isEmpty()) {
                        continue;
                    }
                    dataStore = flushQ.removeFirst();
                    if (dataStore == null) {
                        continue;
                    }
                }
                try {
                    flush(dataStore);
                } catch (DidNotSaveRequestSomeRandomError e) {
                    e.printStackTrace();
                    log.fatal(e);
                }
            } catch (HibernateException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

Editar 2: adicionadowhile(!txD.wasCommitted()) ; (no código acima), ainda assim eu recebo esse malditonested transactions not supported. Na verdade, devido a essa exceção, um registro não está sendo gravado também na tabela. Há algo a ver com o tipo de mesa? Eu tenho INNODB para todas as minhas mesas?

questionAnswers(2)

yourAnswerToTheQuestion