Warum CMT Begehen am Ausgang der EJB-Methode, bei der transaction-Attribut ist "Erforderlich"?

Ich bin immer zu finden, dass meine bereits vorhandene Transaktion ist immer verpflichtet, in jeder Methode einer EJB markiert @ejb.transaction type="Required". Kann das richtig sein?

Meine Erwartung ist, eine EJB "erfordern" eine Transaktion bedeutet: wenn es eines gibt es schon, es wird höflich lassen es uncommitted wenn Sie getan werden, also, wer aufgerufen wird begin() weiterhin verwenden können, es für weitere Operationen vor dem Aufruf commit() oder rollback(). [Natürlich, wenn es keine Transaktion in den ersten Platz, dann die EJB-Methode aufrufen würden beide begin() und commit()/rollback().]

Ist meine Erwartung falsch, oder sollte ich suchen für eine Konfigurations-Fehler?

Es relevant sein könnte, um hinzufügen, dass ich mit Hibernate 3 innerhalb der EJB. Ich bin den Erhalt einer UserTransaction vor dem Aufruf der EJB-Methode. Die EJB-generierten wrapper ruft ServerTransaction.commit() auf die Ausfahrt, die Hibernate hakt und nutzt die Gelegenheit, um in der Nähe seiner Sitzung. Die Fehler ich erhalte, ist ein Hibernate lazy loading exception, da die Sitzung wird geschlossen, wenn ich versuche, auf Getter auf ein Hibernate-persistent-Objekt. So technisch bin ich nicht 100% sicher, ob die ServerTransaction.commit() beobachtete ich unbedingt verpflichtet, die UserTransaction begann ich (vielleicht ServerTransaction.commit() nicht immer tatsächlich Folgen Sie durch mit einem "real" Begehen?), aber wenn es nicht -- dann auf welcher Grundlage ist Hibernate die Session geschlossen wird?

Update: ich glaube, dass meine Annahmen oben richtig war, aber meine Beobachtungen waren ein bisschen ab. Siehe unten für meine selbst gelieferten Antwort.

  • "Wenn es eines gibt es schon, es wird höflich auf, lassen Sie es unverbindlich." Sind Sie sicher, dass Ihre Wahrnehmung hier? Von Ihr akzeptiert die Antwort, "Die UserTransaction ich begann, blieb offen, aber CMT erstellt eine neue Transaktion, bei der Einreise in die EJB-Methode, trotz der "Required" - Attribut." Dies ist ein Versuch, erstellen Sie ein weiteres geschachtelte Transaktionen und sollte stattdessen zu einer Ausnahme führen, wie -- javax.transaction.NotSupportedException: Nested transaction not supported. werden, da verschachtelte Transaktionen werden nicht unterstützt in Java EE. Ich habe irregeführt vollständig über das, was ich bereits wusste, über CMT und BMT.
  • Können Sie sich erinnern, das test-Szenario verwendet Vieren her?
  • Ich erinnere mich an die Validierung in mehrfacher Hinsicht sowohl, dass mein UserTransaction blieb offen und der CMT Transaktion ein commit ausgeführt wurde, auf exit aus dem container-verwalteten EJB. Dieses Verständnis erlaubt mir, um Platz für die situation erfolgreich, wenn nicht ordnungsgemäß. Ich habe nichts gefunden, um zu zeigen, dass WL hatte erwiesen, Verhalten sich anders (beachten Sie, dass die tests angeführt von DavidBlevens verwendet OBLIGATORISCHEN ihm zufolge nicht ERFORDERLICH, da wurde mein Fall). Dies war 3-4 Verträge gemeldet, so dass ich kann Ihnen nicht mehr als das, sorry.
  • Ich entschuldige mich für die Rechtschreibfehler von @DavidBlevins. Anscheinend kann ich nicht mehr reparieren, weil es 5 Minuten vergangen sind.
InformationsquelleAutor nclark | 2011-08-25
Schreibe einen Kommentar