Transaction RequiresNew Problem

Status
Nicht offen für weitere Antworten.

Pulpapex

Mitglied
Hallo,

Ich habe ein Problem mit dem "RequiresNew" Attribut für Transaktionen. Folgende Konstellation: JBoss 3.2.1 Server mit DB2 local-tx-datasource (Treiber: db2jcc.jar), Hibernate 2.1 und CMT-SessionBeans. Eine Methode mit "Required" Attribut ruft eine Methode mit "RequiresNew" Attribut auf. Der Aufruf erfolgt natürlich über das EJBObject (in meinem Fall ein EJBLocalObject).

Wenn die Transaktion der aufrufenden Methode mit setRollbackOnly zurückgerollt wird, sollte man doch annehmen, dass Änderungen, die in der aufgerufenen Methode vorgenommen wurden, davon nicht betroffen sind. Auf Grund des "RequiresNew" Attributs sollte die Methode ja in einer eigenen Transaktion laufen. Das ist aber leider nicht der Fall. Ein Rollback macht bei mir immer alle Änderungen rückgängig.

Das Ganze nochmal in Pseudo-Code:
Code:
[Required]
methodA() {

    // Business-Data lesen/schreiben.

    [RequiresNew]
    methodB() {
        // Logmeldungen schreiben.
        // Sollen auch bei einem Rollback in methodA erhalten bleiben.
    }

    // Transaktion zurückrollen.
    // Macht seltsamerweise auch die in methodB 
    // vorgenommene Änderungen  rückgängig.
    getSessionContext().setRollbackOnly();
}

Bemerkung:
Den Log-Ausgaben zufolge, verläuft alles nach Plan: Für methodB erscheint eine Meldung mit Transaction Status 4 (javax.transaction.Status.STATUS_COMMITTED). Kurz darauf folgt die Meldung für methodA mit Transaction Status 3 (javax.transaction.Status.STATUS_ROLLEDBACK).

Kennt jemand dieses Verhalten? Ich schätze, dass es mit DB2 zusammenhängt ... aber kann alles mögliche sein ;-)

Gruß
Pulpapex
 

semi

Top Contributor
>Eine Methode mit "Required" Attribut ruft eine Methode mit "RequiresNew" Attribut auf.
Wenn Du es direkt tust,
z.B.
Code:
public void a() // mit "required" TX-Attribut
{
  b();
}

public void b() // mit "requiresNew" TX-Attribut
{
  ...
}
dann werden beide im gleichen Transaktionskontext ausgeführt.
Klartext: Beide "required" innerhalb einer und der gleichen Transaktion.
Oder anders ausgedrückt, einfach ein Methodenaufruf in der aktuellen Klasse.

Du musst für diesen Fall (den Methodenaufruf) eine neue Session erzeugen.

Gruß,
Michael
 
G

Guest

Gast
Semi,
das ist es nicht. Ich hab doch geschrieben:
Pulpapex hat gesagt.:
[..] Der Aufruf erfolgt natürlich über das EJBObject (in meinem Fall ein EJBLocalObject).
Ich rufe also auf:
Code:
getSessionContext().getEJBLocalObject().methodB();
Dieser Aufruf erfolgt über einen von JBoss bereitgestellten Proxy und läuft damit durch den Container. Ich kann mir nicht vorstellen, dass es nötig ist, über das Home-Interface eine neue Session zu öffnen.
 

semi

Top Contributor
Sorry, ich habe Deine Frage zu oberflächlich gelesen.
Bist Du 100% sicher, dass der Deployment-Descriptor korrekt ist?

Ich habe Dein Szenario mit SAPDB und HSQLDB (bei jboss dabei)
nachgemacht (DB2 habe ich nicht) und es funktionierte bei beiden
Datenbanken einwandfrei. Alle Änderungen in der "RequiresNew"-Methode
wurden übernommen, der Rest (vom Aufrufer) verworfen.

Bei SAPDB habe ich auch die Möglichkeit ein Trace der DB-Server Aktivitäten
zu loggen. Da sehe ich, dass die Transaktionen verschachtelt sind.

Es sind immer wieder die kleinen Fehler, die einen auf die Palme bringen. Was? :)
Sorry DB2 kenne ich nicht, um irgendwas schlaues darüber zu sagen.
Versuche vielleicht eine andere Datenbank (Test mit HSQLDB ist schnell eingerichtet)
und wenn es läuft, dann weisst Du zumindest dass es an DB2 oder dem
dazugehörigen JDBC-Treiber liegt.

Gruß,
Michael
 

semi

Top Contributor
Übrigens, MySQL 4.0.12 mit InnoDB funzt auch.
Es muss an Deinen Einstellungen liegen. Ich kann
mir nicht vorstellen, dass DB2 sowas nicht unterstützt.

Sag' bitte Bescheid, wenn Du die Lösung hast.
Die Ursache, wenn Datenbankseitig, würde mich auch interessieren.

Gruß,
Michael
 

Pulpapex

Mitglied
Hat ein bisschen länger gedauert. Ich hab's jetzt auch mit MySQL 4.0.xx ausprobiert, funktioniert auch nicht. Ich hab keinen Schimmer woran es liegen könnte. Hier mal der Deployment Descriptor, den ich verwende, in einer vereinfachten Form. Soweit ich weiss gibt es im JBoss-Deployment-Descriptor keine weiteren Einstellungen für Transaktionen:

Code:
<ejb-jar>
	<enterprise-beans>

		
		<session>
			<display-name>Import-Local</display-name>
			<ejb-name>ImportLocal</ejb-name>
			<local-home>ejb.ImportLocalHome</local-home>
			<local>ejb.ImportLocal</local>
			<ejb-class>ejb.ImportLocalBean</ejb-class>
			<session-type>Stateless</session-type>
			<transaction-type>Container</transaction-type>

			<resource-ref>
				<res-ref-name>hibernate/SessionFactory</res-ref-name>
				<res-type>net.sf.hibernate.SessionFactory</res-type>
				<res-auth>Container</res-auth>
			</resource-ref>
		</session>

	</enterprise-beans>

	<assembly-descriptor>

		
		<container-transaction>
			<method>
				<ejb-name>ImportLocal</ejb-name>
				<method-name>*</method-name>
			</method>
			<trans-attribute>Required</trans-attribute>
		</container-transaction>

		
		<container-transaction>
			<method>
				<ejb-name>ImportLocal</ejb-name>
				<method-name>saveImportStatus</method-name>
				<method-params>
					<method-param>vo.ImportStatus</method-param>
				</method-params>
			</method>
			<trans-attribute>RequiresNew</trans-attribute>
		</container-transaction>

	</assembly-descriptor>
</ejb-jar>

Wie gesagt verwende ich JBoss 3.2 und Hibernate 2.1. Hibernate macht nichts mit Transaktionen und überlässt alles JTA.


Gruß
Pulpapex
 

semi

Top Contributor
Der deployment descriptor sieht gut aus.
Ich kann auch keinen Fehler erkennen.
Ich habe es mit JBoss 3.0.0 und 3.2 versucht, bei beiden
hat's funktioniert. ???:L

Versuche mal das hier
http://home.arcor.de/mise/public/txtest.zip
Im Unterverzeichnis deploy steht die JAR'-Datei, die Du direkt
deployen kannst.
Es erstellt eine Tabelle "Test" mit den Feldern "ID" und "Name".
Stelle in jboss3.2\server\default\conf\standardjbosscmp-jdbc.xml
<create-table>true</create-table> ein.
exec-test.bat führt das Testprogramm aus.

Wenn nach der Ausführung 100 Datensätze mit dem Namen "testRequiresNew()"
drin stehen, dann ist es korrekt gelaufen.
Wenn nicht, dann geht die Suche nach Konfigurationsfehlern weiter ;)

PS: Das ganze ist größtenteils aus einer IDE (JDeveloper) heraus generiert,
vergiss also die Formatierung :)

Gruß,
Michael
 

Pulpapex

Mitglied
Ich hab dein Test-Programm ausprobiert, hab es einmal für BMP und einmal für Hibernate umgeschrieben. Funktioniert mit MySQL und auch mit DB2. Wahrscheinlich liegt es an der Hibernate-Session, die ich in der Required-Methode öffne und in der RequiresNew-Methode weiterverwende. Die Hibernate-Doku sagt zwar, eine Session kann für mehrere Transaktionen verwendet werden, aber scheinbar ist das nicht immer der Fall.

Ich hab im Netz eine Lösung gefunden, die automatisch für jede JTA-Transaktion eine neue Session öffnet. Bin ich noch am Ausprobieren ob das funktioniert.

Link: Reuse Hibernate Session instances within a transaction

Gruß
Pulpapex

PS: was ist denn mit dem Deployment Descriptor in meinem letzten Post passiert? Sah schon mal besser aus.
 

semi

Top Contributor
OK, dann kann man Datenbank-/Treiberfehler ausschliessen.
Mit Hibernate habe ich noch nie etwas gemacht, daher fällt mir
dazu nichts ein.
Ein Arbeitskollege macht was mit Struts aber Hibernate ist bei uns
nicht mal in Planung. CMP verwenden wir momentan ebenfalls nicht
(nur BMP) um "notfalls" die Persistenzschicht schnell auswechseln zu
können.

Gruß,
Michael
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Problem mit Java Transaction API Allgemeines EE 2
B EJB - Transaction Attribute Allgemeines EE 6
D Problem mit Update von ApacheHttpClient von 5.2 auf 5.3 Allgemeines EE 10
D Problem mit redundanten Servern Allgemeines EE 7
Azemaria JSF: Problem bei der einfachsten Applikation Allgemeines EE 2
P JPA Internal Problem Nullpointer Allgemeines EE 10
S MessageDrivenBean Problem beim Zugriff auf Stateful EJB Allgemeines EE 2
M Glassfish Deployment-Problem unter Eclipse Allgemeines EE 0
B Problem beim Lesen des Codes... Allgemeines EE 2
R JPA Problem beim Speichern eines Users Allgemeines EE 2
S WebSocket Problem Allgemeines EE 0
F Eclipse/Java EE Debug-Problem Allgemeines EE 1
G Problem: Servlet in JSP einbinden mit <jsp:include> Allgemeines EE 3
Raidri [SEAM] rich:dataTable sortBy Problem Allgemeines EE 6
T Problem mit den Beispielen von Apache Allgemeines EE 5
W JSF Validator Problem HTTP Status 500 Allgemeines EE 2
E JBoss 7.1 Datasource Problem Allgemeines EE 2
M JSP Problem -unbestimmte Anzahl von Werten Transportieren Allgemeines EE 9
S Problem mit EJB Verständnis Allgemeines EE 4
B Problem beim einbinden einer CSS in eine JSP Allgemeines EE 8
F JSP Problem mit Datenbankanbindung über Glassfishserver Allgemeines EE 4
S java Entities Problem Allgemeines EE 19
S Embedded JBoss Problem beim Deployment Allgemeines EE 4
E Session Problem Allgemeines EE 9
F problem mit nullpointer bei DB zugriff Allgemeines EE 2
A Erste Schritte... Problem mit Hibernate Allgemeines EE 15
ruutaiokwu jboss problem - work-verzeichnis muss manuell gelöscht werden??? Allgemeines EE 5
Stillmatic sendRedirect Problem! Allgemeines EE 3
M Problem mit Lookup auf EJB3 mit Glassfish Allgemeines EE 11
0 Problem mit librarys javax.servlet.http.HttpServletRequest cannot be resolved Allgemeines EE 1
X JBoss InitialContext problem Allgemeines EE 5
LordZed Problem mit dem einbinden von Bibliotheken, die sich gegenseitig verwenden Allgemeines EE 5
H GWT Problem beim Ausführen Allgemeines EE 8
Q Problem mit JMS und Weblogic 10 Allgemeines EE 5
E Performance-Problem beim ersten Request Allgemeines EE 4
G Multi User Problem Allgemeines EE 8
G Datasource Problem Allgemeines EE 1
J OOP Java Array Problem Allgemeines EE 2
D Problem mit EJB: Bean soll Objekt eigener Klasse zurückgeben Allgemeines EE 2
N JavaMail Problem Allgemeines EE 4
N JBoss Problem mit Bibliothek in unterschiedlichen Versionen Allgemeines EE 2
A Tomcat -- JSP: komisches Problem Allgemeines EE 11
W Speicher-Problem bei WebApp unter Tomcat, Struts, Hibernate Allgemeines EE 3
B Problem mit ActionListener Allgemeines EE 13
G Simples JSF-Projekt in Eclipse - Problem Allgemeines EE 9
O eclipse - tomcat: Problem bei einfachem Webservice Allgemeines EE 16
J Problem mit EJB Aufruf und DualCore Rechner Allgemeines EE 4
J ejb3.0 datenbank problem Allgemeines EE 2
J Problem mit Zurück-Button Allgemeines EE 2
T Tomcat: JNDI + JDBC Problem Allgemeines EE 3
J problem mit jsp/js Allgemeines EE 2
B Help - EJB2 - Problem mit Hybernate und "LIMIT" Allgemeines EE 6
B JSTL Problem Allgemeines EE 8
byte Tomcat Deployment Problem (HTTP Status 503) Allgemeines EE 8
S Problem mit t:selectOneRadio und ValueChangeListener Allgemeines EE 2
S Problem mit Struts und tiles Allgemeines EE 4
B Problem mit JBoss-4.2.1.GA Allgemeines EE 8
N Tiles - JSF Problem Allgemeines EE 3
M JSF & EJB "Bean not bound" Problem Allgemeines EE 4
V MYSQL JDBC;java.lang.ClassNotFoundException; Problem Eclipse Allgemeines EE 3
megachucky JMS - Problem mit TemporaryQueue Allgemeines EE 2
G Problem mit MimeType/ContentType Allgemeines EE 4
E Java Mail problem Allgemeines EE 5
Y XFire - Maven Build Problem Allgemeines EE 2
D JSP Problem mit equals? Allgemeines EE 2
A Eclipse Start-Problem Allgemeines EE 5
S JSF - Custom converter Problem Allgemeines EE 3
Y JSF Uhrzeitausgabe Problem Allgemeines EE 4
M servlet --> jsp - problem beim umstrukturieren Allgemeines EE 5
Y JSF - rendered Problem Allgemeines EE 1
D Servlet Problem über Server Allgemeines EE 26
Zed JSF h:inputText h:outputText update Problem Allgemeines EE 2
K mysql treiber problem wenn import java.sql.* bei _servlet_ Allgemeines EE 2
S JDBC Mysql Connection Problem - datasource null Allgemeines EE 3
T Session-Problem Allgemeines EE 2
R Tiles - Layout-Problem wegen Leerzeichen Allgemeines EE 6
G Tomcat / Eclipse oder Web.xml Problem Allgemeines EE 11
S Netbeans 5.5 Visual Web Pack Problem mit INSERT und PK Allgemeines EE 4
D JSF Problem mit Action Allgemeines EE 2
F Klassen und zugriffs Problem "Help wanted"! Allgemeines EE 16
D <input type="file"> Problem Allgemeines EE 6
N Struts - Problem mit <html:link> Action Allgemeines EE 3
A Problem / Fehler beim Einbinden einer Klasse in ein JSP Allgemeines EE 20
G Session Problem Allgemeines EE 5
T Ant Compiler Problem Allgemeines EE 9
T Problem dem Zaehler in mein Java - Code Allgemeines EE 2
A Hibernate-Problem mit MySQL-Cluster Allgemeines EE 6
H Servlet problem Allgemeines EE 10
G Problem mit Benutzerverwaltung Allgemeines EE 3
S Hibernate Mapping Problem Allgemeines EE 3
S Hibernate INSERT Problem Allgemeines EE 11
S Dummes JSP-Problem Allgemeines EE 8
P EJB-Installations-Problem Allgemeines EE 4
S CSS Problem in JSP Allgemeines EE 16
C Problem mit html:optionsCollection Allgemeines EE 4
R HILFE: Problem mit JSF examples Allgemeines EE 10
R Problem mit value-expression Allgemeines EE 7
R Problem mit for-schleife in JSP tag Allgemeines EE 8
B Struts Problem: Array in JSP ausgeben (logic:iterate) Allgemeines EE 12
M Redirct-Problem Allgemeines EE 4

Ähnliche Java Themen


Oben