Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Seam @Transactional Annotation funktioniert nicht?

Ich bin nicht mit der Funktionsweise von Seam vertraut, daher entschuldige ich mich im Voraus, falls diese Antwort nicht zutrifft.

Mir ist aufgefallen, dass die Methode @Transactional ist ist protected . Dies impliziert für mich, dass es von einer anderen internen Methode aufgerufen wird.

Mit Springs AOP markieren Sie die Öffentlichkeit Methoden mit @Transactional die umschlossen und durch einen Transaktionsproxy ersetzt werden. Wenn eine externe Klasse den public aufruft -Methode ruft sie den Proxy auf, der die Transaktion bildet. Wenn die externe Klasse eine andere public aufruft Methode, die nicht ist gekennzeichnet mit @Transactional die dann eine interne Methode aufruft, dh es wird keine Transaktion erstellt, da der Proxy überhaupt nicht aufgerufen wird.

Im Frühling, auch wenn Sie Ihre doWork() ändern Methode öffentlich zu sein, würde das gleiche Problem auftreten. Keine Transaktion, weil das Proxy-Objekt nicht aufgerufen wird. Methodenaufrufe innerhalb der Klasse führen keine Aufrufe an das Proxy-Objekt durch.

Eine schnelle Lektüre einiger Dokumentationen scheint darauf hinzudeuten, dass Seam wie Spring AOP CGLib-Proxying verwendet . Die Frage ist, ob es in der Lage ist, alle Methoden zu proxieren – selbst wenn sie innerhalb des Proxy-Objekts aufgerufen werden. Entschuldigen Sie die Zeitverschwendung, wenn diese Antwort nicht zutrifft.