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:
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
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