ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
1015
1015
EMPFEHLEN
-
Hallo!
Ich habe folgendes Problem:
Ich habe Entity und Session Beans mit CMP und CMT.
Aus der Business-Methode eines Session-Beans rufe ich Methoden des selben Session-Beans und eines anderen Session-Beans auf.
Im Fehlerfall fange ich die Exceptions und setze sessionContext.setRollbackOnly(). Allerdings sind die Daten, die die gerufenen Methoden schreiben, schon committed. Diese sollen aber grade ge-rollback-t werden.
Liegt es an der Konfiguration, oder mache ich etwas falsch?
Beispielcode:
Code :1 2 3 4 5 6 7
try{ methode1(); methode2(); } catch (Exception e){ sessionContext.setRollbackOnly(); throw e; }
Danke...Tobias
-
N'Abend,
eigentlich sollte das schon funktionieren mit den Transaktionen. Hast du vielleicht für eine deiner Methoden ein anderes Transaktionsattribut als "Required" gesetzt?
gruß
THMDIf Java had true garbage collection, most programs would delete themselves upon execution. (Robert Sewell)
-
Danke schon mal für die Antwort!
Ich habe jetzt im selben Session-Bean folgendes Tag hinzugefügt:Code :1
@ejb.transaction type="Required"
Die gesamte Deklaration sieht folgendermaßen aus:
Code :1 2 3 4 5 6 7 8 9 10 11
/** * * @ejb.bean name = "ClientViewOrder" type = "Stateful" display-name = * "ClientViewOrder" description = "ClientViewOrder EJB" view-type = * "remote" jndi-name = "ejb/ClientViewOrderHome" * transaction-type="Container" * @ejb.transaction type="Required" * @jboss.method-attributes pattern = "get*" read-only = "true" * @ejb.env-entry name="application_name" type="java.lang.String" * value="@application.name@" */
In der anderen Session-Bean, in der ebenfalls eine Methode aufgerufen wird, stand bislang.Code :1
@ejb.transaction type = "Supports"
Allerdings funktioniert der Rollback auch nicht, wenn ich hier ebenfalls "required" setze. Die gesamte Deklaration des aufgerufenen Session-Beans lautet:
Code :1 2 3 4 5 6 7 8 9 10 11
/** * @ejb.bean name = "NewOrder" type = "Stateless" display-name = "NewOrder" * description = "NewOrder EJB" view-type = "local" jndi-name = * "ejb/NewOrderHome" local-jndi-name = "ejb/NewOrderBeanLocalHome" * * @ejb.env-entry name="application_name" type="java.lang.String" * value="@application.name@" * * @ejb.transaction type = "Supports" * */
Leider habe ich in der EJB-Dokumentation keine Infos erhalten, was 'Required' und 'Support' genau bedeutet.
Woran könnte es noch liegen, dass der Rollback nicht ausgeführt wird
Danke!
-
19.06.06 18:52 #4
- Registriert seit
- Mar 2001
- Ort
- München
- Beiträge
- 4.785
Required
Wenn die Methode ausserhalb einer Transaktion aufgerufen wird dann wird eine Transaktion neu aufgebaut.
Bei Supports im Gegensatz wird keine neue Transaktion erstellt wenn die Methode ausserhalb einer Transaktion aufgerufen wird.Erst wenn der letzte Programmierer eingesperrt...
...und die letzte Idee patentiert ist, werdet ihr merken, dass Anwälte nicht programmieren können.
-------------------
chris: hey Tom hast du eigentlich ne Freundin
jdar: ich bin tutorials.de Mod!
-
Hallo,
deine XDoclet Tags sehen auf den ersten Blick OK aus. Ich nehme mal an er erzeugt dazu auch die richtigen Deskriptoren. Dann bleiben jetzt aufgrund des fehlenden eigentlichen Quellcodes der Methoden nur Vermutungen:
- Was meinst du mit "Daten werden geschrieben", benutzt du dafür Entity Beans?
- Wenn ja - haben die vielleicht noch eine andere Transaktionseinstellung?
- Ist der SessionContext auch richtig gesetzt?
Versuchs doch mal anstatt dem setRollbackOnly() testweise ein
Er sollte dir jetzt eine Fehlermeldung bringen und gleichzeitig einen Rollback durchführen.Code :1
throw new EJBException(e);
Wenn trotz Fehlermeldung die fehlerhaften Daten gespeichert werden, würde mich interessieren wie und wo du das Speichern durchführst. Das riecht dann nämlich dannach, das das Speichern außerhalb des Transaktionscontextes geschieht und dann ist es egal ob du einen Rollback machst oder nicht.
Gruß
THMDIf Java had true garbage collection, most programs would delete themselves upon execution. (Robert Sewell)
-
Hm, alle Versuche schlagen bis jetzt fehl. Auch der Tipp mit der EJBException funktioniert leider nicht.
Noch mal etwas genauer: In einer Session-Bean (Code unten) wird eine Methode einer anderen Session-Bean drei Mal aufgerufen (methode1()). In methode1() werden Entity-Beans aufgerufen und somit Daten in die Datenbank gespeichert. Wahrscheinlich wird hier auch schon committed.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
try{ //1. Aufruf von methode1() in zweiter Session-Bean methode1(); ... //2. Aufruf von methode1() in zweiter Session-Bean methode1(); ... //3. Aufruf von methode1() in zweiter Session-Bean methode1(); } catch (Exception e){ sessionContext.setRollbackOnly(); throw e; }
Nun kann es passieren, dass z.B. erst beim dritten Aufruf von methode1() eine Fehlermeldung kommt, und es müssten die 2 zuvor durchgeführten Transaktionen durch den Rollback idealerweise rückgängig gemacht werden. Daher der try-catch-Block um die 3 Aufrufe von methode1().
Die Entity-Beans haben teilweise eine 'Supports'-Transaktionseinstellung. Allerdings habe ich schon versucht, alle auf 'Supports' zu setzen, was nichts gebracht hat.
Kann schon sein, dass das Speichern außerhalb des Transaktionskontextes geschieht (eben so wie oben beschrieben), aber gibt es keine Möglichkeit mit dem Rollback alle bislang durchgeführten Speicherungen zu erfassen bzw. zu verhindern, dass die Daten schon committed werden?
-
20.06.06 19:21 #7
- Registriert seit
- Mar 2001
- Ort
- München
- Beiträge
- 4.785
Wieso hat die Methode die du aufrufst Support?
Denn dies verursacht das wenn die Methode ausserhalb einer Transaktion aufgerufen wird sie ohne Transaktionsunterstützung läuft.
Mandatory wirft dir eine Exception wenn sie ausserhalb einer Transaktion aufgerufen wird.
Definiere das mal, dann siehst du ja ob der Aufrufende auch wirklich transaktionell läuft.
Ansonsten bekommst du deine Exception.Erst wenn der letzte Programmierer eingesperrt...
...und die letzte Idee patentiert ist, werdet ihr merken, dass Anwälte nicht programmieren können.
-------------------
chris: hey Tom hast du eigentlich ne Freundin
jdar: ich bin tutorials.de Mod!
Ähnliche Themen
-
Hibernate, Spring --> kein Rollback
Von yogitobi im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 2Letzter Beitrag: 24.03.09, 17:58 -
Commit und Rollback
Von zuckerbrini im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 19.11.08, 13:31 -
Transactions, Commit, Rollback...
Von jazy jaf im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 12.02.07, 15:25 -
Transaktionssicherheit InnoDB (Commit/Rollback)
Von Mik3e im Forum PHPAntworten: 0Letzter Beitrag: 21.10.05, 11:06 -
automatisches Rollback
Von Greenhorn_80 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 3Letzter Beitrag: 10.05.05, 21:50





Zitieren
Login




