Bitte vergessen Sie nicht, die q und a zu stimmen .. danke \ Hibernate 4.1.9 (neueste endgültige Version) meldet "verschachtelte Transaktionen werden nicht unterstützt"

Ich bekomme eine

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)

Code, der diese Ausnahme auslöst. Ich rufe Flush von einem Thread auf, der unendlich läuft, bis Daten zum Flush vorliegen.

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

Bearbeiten: Ich rufe Flush in einem unabhängigen Thread auf, da die Datenspeicherliste Daten enthält. Soweit ich weiß, handelt es sich um einen Synchronisierungsoperationsaufruf zum Leeren, sodass das Leeren im Idealfall erst nach Abschluss der Transaktion zurückkehren sollte. Ich möchte es so, wie ich es am wenigsten erwarten möchte. Da es sich um einen unabhängigen Thread handelt, der seine Arbeit erledigt, ist mir nur eine Synchronisierungsoperation wichtig. Jetzt ist meine Frage, ist txD.commit eine asynchrone Operation? Wird es zurückgegeben, bevor die Transaktion abgeschlossen werden kann? Wenn ja, gibt es eine Möglichkeit, ein Commit für "Warten" durchzuführen, bis die Transaktion abgeschlossen ist?

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

Edit 2: Hinzugefügtwhile(!txD.wasCommitted()) ; (im obigen Code), ich bekomme das immer noch verdammtnested transactions not supported. Aufgrund dieser Ausnahme wird ein Datensatz auch nicht von der Tabelle beschrieben. Hat das etwas mit der Art des Tisches zu tun? Ich habe INNODB für alle meine Tische?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage