Por favor, no se olvide de votar por encima de q y a ... gracias \ Hibernate 4.1.9 (última compilación final) reportando `transacciones anidadas no soportadas`

Estoy recibiendo un

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 lanza esa excepción. Estoy llamando a la descarga de un subproceso que se ejecuta infinito hasta que haya datos para vaciar.

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();
}

Edición: estoy llamando a flush en un hilo independiente ya que la lista de datos contiene datos. Por lo que veo, es una llamada de operación de sincronización para vaciar, por lo que lo ideal sería que no se devuelva hasta que se complete la transacción. Me gustaría que así sea lo menos que quiero esperar. Ya que es un subproceso independiente que hace su trabajo, todo lo que me importa es que la descarga sea una operación de sincronización. Ahora mi pregunta es, ¿es txD.commit una operación asíncrona? ¿Vuelve antes de que la transacción tenga la oportunidad de terminar? En caso afirmativo, ¿hay alguna forma de comprometerse a "Esperar" hasta que se complete la transacción?

        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();
            }
        }
    }

Edición 2: Añadidowhile(!txD.wasCommitted()) ; (en el código de arriba), todavía tengo esa malditanested transactions not supported. De hecho, debido a esta excepción, la tabla no está escribiendo un registro. ¿Hay algo que ver con el tipo de tabla? Tengo INNODB para todas mis mesas?

Respuestas a la pregunta(2)

Su respuesta a la pregunta