Transaktion nicht erfolgreich gestartet (beim tx.commit() ist umgeben von einer if-Bedingung)
Erste mal, dass ich lief in dieser Fehlermeldung habe ich inmitten meiner tx.commit() mit einer if-Bedingung, aber ich bin nicht sicher, warum ich bin immer noch diese Fehlermeldung.
Struts Problem Report
Struts has detected an unhandled exception:
Messages:
Transaction not successfully started
File: org/hibernate/engine/transaction/spi/AbstractTransactionImpl.java
Line number: 200
Stacktraces
org.hibernate.TransactionException: Transaction not successfully started
org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:200)
Nachdem ein Produkt ausgewählt wurde, durch den Benutzer, in meiner main Funktion, ich nenne zwei Funktionen wie folgt.
Erste Funktion zum abrufen des Objekts des ausgewählten Produkts.
Zweite Funktion, um zu überprüfen, ob ausgewählte Benutzer hat das Produkt daher gibt es true zurück, wenn der Kunde hat das Produkt sonst false zurück;
Funktion 1
....
Product pro = new Product();
final Session session = HibernateUtil.getSession();
try {
final Transaction tx = session.beginTransaction();
try {
pro = (Product) session.get(Product.class, id);
if (!tx.wasCommitted()) {
tx.commit();
}
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
}
} finally {
HibernateUtil.closeSession();
}
.....
Funktion 2
.....
final Session session = HibernateUtil.getSession();
try {
final Transaction tx = session.beginTransaction();
try {
User user = (User) session.get(User.class, id);
if (!tx.wasCommitted()) {
tx.commit();
}
if(client.hasProduct(proId)){
return client.getProduct(proId);
}
return false;
} catch (Exception e) {
tx.rollback(); <<<Error is on this line
e.printStackTrace();
}
} finally {
HibernateUtil.closeSession();
}
....
- Ich denke, Sie brauchen nicht initialisiert Transaktion mit der definitiven.
- heißt das, es sollte nicht endgültig sein? oder sollte es nicht initialisiert werden überhaupt?
- initialisieren ohne Finale.initialisieren einer Sitzung ohne ein Finale zu.
- Haben Sie versucht, dieses:
if (tx!=null) tx.rollback();
- danke, aber ich brauche, um zu wissen, was das auslösen der Ausnahme aus diesen einfachen codes nicht nur die Handhabung, es
- Könnten Sie bitte post die gesamte stack-trace?
- ok ich werde
- Ist diese Zeile auf Funktion 2 aufrufende Methode von Funktion 1:
return client.getProduct(proId);
??? - Nein, die Methode ist getrennt
- Dies tut getProduct tun
new Transaction tx = session.beginTransaction();
? - ja, es tut es gibt das Objekt zurück, von Produkt
- Ich glaube, der Winterschlaf steht vor einem problem in der Transaktion Anfang, so fügen Sie einige mehr debug-Anweisung vor und nach beginTransaction() einfach zu prüfen, ob die Transaktion begonnen, so dass auf andere Ausnahme, die Sie wiederherstellen können es
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf Die Transaktion.isActive() Methode. Sie können wrap-Aufruf
rollback()
Methode, mit der Bedingung, zu überprüfen, ob die Transaktion noch aktiv ist. Und das zweite, ich würde es vorziehen, die folgenden code:Selbstverständlich, code in der
finally
Abschnitt besser zu wickeln in öffentlichen, statischen Methode, und rufen Sie in jedemfinally
.BTW, warum tun Sie sich etwas außerhalb tranaction? Ich in der Regel verpflichten nach alle Dinge erledigt werden, um eine bessere Konsistenz und vermeiden
LazyInitializationException
.Eine Möglichkeit ist, dass die Ausnahme, die Sie fangen in der zweiten Funktionen aus dem code nach die
commit()
, so dass Sie am Ende versucht, einen rollback für eine Transaktion, die bereits begangen, was nicht erlaubt ist.Könnten Sie versuchen, Reorganisation, Ihren code, um sicherzustellen, dass rollback wird nie genannt nach dem commit. Vielleicht sogar so etwas einfaches wie eine Reduzierung des Umfangs der inneren try-catch:
Gibt der Fehler die Transaktion nicht gestartet zu der Zeit versuchte Rollback - und das problem kann sein, dass Sie versuchen, wickeln einen
get
, die keine Auswirkungen auf den db-Zustand und nicht hinterlassen Müll, muss ein commit oder ein Rollback ausgeführt. Ändert sich nichts, wenn Sie ausführenselect *
.Zusätzlich zu diesem, können Sie extrahieren möchten diese Transaktion handling in eine gängige Methode, die unabhängig von der Arbeit, so dass Sie nicht haben, dies zu schreiben, immer und immer wieder, dass Blätter Ihren code öffnen für bugs. Im Grunde, wie es scheint, sind Sie immer DB-Objekte, sondern dann vermischen Sie einige business-Logik innerhalb der gleichen Methode. Vielleicht in Betracht ziehen etwas zu tun, wie unten:
DB-Handling-Funktion
Nun, Sie können pull-Objekt der DB (beachten Sie, dass Sie freistehendes, aber immer noch gültig ist), können Sie dann arbeiten auf den Objekten. Ich viele, die nicht aufgenommen haben, genau das, was Sie brauchen, um zu überprüfen, aber es scheint, wie es ist so etwas wie:
Beispiel-Vergleich-Funktion