Frühling - @Transactional - Was passiert im hintergrund?
Ich will wissen, was eigentlich passiert, wenn Sie kommentieren eine Methode, mit @Transactional
?
Natürlich weiß ich, dass der Frühling wickeln, die Methode in einer Transaktion.
Aber ich habe folgende Zweifel:
- Hörte ich, dass der Frühling schafft eine proxy-Klasse? Kann jemand erklären, diese in mehr Tiefe. Was tatsächlich gespeichert ist, in die proxy-Klasse? Was passiert mit der aktuellen Klasse? Und wie kann ich sehen, Feder erzeugt Proxy-Klasse
- Ich auch gelesen, im Frühjahr Dokumente:
Hinweis: Da dieser Mechanismus basiert auf proxies, nur 'externe' Methode, die Anrufe kommen durch den proxy abgefangen werden. Dies bedeutet, dass "selbst-Aufruf', d.h. eine Methode innerhalb der Ziel-Objekt ruft eine andere Methode des Zielobjekts, führt nicht zu einer tatsächlichen Transaktion zur Laufzeit, auch wenn die aufgerufene Methode ist gekennzeichnet mit
@Transactional
!
Quelle: http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html
Warum nur externe Methode Aufrufe wird unter Transaktion und nicht das selbst-Aufruf-Methoden?
InformationsquelleAutor der Frage peakit | 2009-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein großes Thema. Der Frühling Referenz doc widmet mehrere Kapitel auf. Ich empfehle die Lektüre der auf Aspekt-Orientierte Programmierung und Transaktionenwie Spring deklaratives Transaktions-Unterstützung verwendet AOP bei seiner Gründung.
Aber auf einem sehr hohen Niveau, Feder erzeugt proxies für Klassen, die erklären @Transactional auf die Klasse selbst oder auf die Mitglieder. Der proxy wird meist zur Laufzeit unsichtbar. Es bietet eine Möglichkeit für den Frühling zu injizieren Verhalten vor, nach oder rund um Methodenaufrufe in das Objekt proxyweiterleitung. Transaktions-management ist nur ein Beispiel für die Verhaltensweisen, die eingehakt werden kann. Sicherheits-checks sind ein weiteres. Und Sie können Ihre eigene, auch für Dinge wie die Protokollierung. Also, wenn Sie kommentieren eine Methode, mit @TransactionalFrühling erstellt dynamisch einen proxy, der implementiert das gleiche interface(s) als die Klasse, die Sie sind, kommentieren. Und wenn die clients machen Aufruf in Ihrem Objekt, die Anrufe abgefangen und die Verhaltensweisen injiziert, der über den proxy-Mechanismus.
Transaktionen in EJB funktionieren ähnlich, übrigens.
Als Sie beobachtet, durch den proxy-Mechanismus funktioniert nur, wenn rufe aus einem externen Objekt. Wenn Sie ein internes Gespräch innerhalb des Objekts, Sie machen wirklich einen Anruf durch die "diese" die Referenz, die umgeht den proxy. Es gibt Möglichkeiten zu arbeiten, um dieses problem jedoch. Ich erkläre ein Ansatz in dieses forum posten in dem ich eine BeanFactoryPostProcessor zu injizieren, eine Instanz der proxy in "self-referencing" von Klassen zur Laufzeit. Ich speichern Sie diese Referenz, um eine member-variable namens "mir". Dann, wenn ich brauche, um interne Gespräche führen, erfordern eine änderung in der Transaktion status der thread, ich direkt der Anruf durch den proxy (z.B. "mir.someMethod()".) Der forum post ausführlich erklärt. Beachten Sie, dass die BeanFactoryPostProcessor code wäre ein wenig anders, als es geschrieben wurde, wieder in den Frühling 1.x Zeitraum. Aber hoffentlich gibt Ihnen eine Vorstellung. Ich habe eine aktualisierte version, die könnte ich wahrscheinlich zur Verfügung stellen.
InformationsquelleAutor der Antwort Rob H
Wenn der Frühling lädt Ihre bean-Definitionen, und so konfiguriert wurde, dass Aussehen für die @Transactional-Annotationen, wird es schaffen diese proxy-Objekte, um Ihre eigentliche bean. Diese proxy-Objekte sind Instanzen von Klassen automatisch zur Laufzeit generiert. Das Standard-Verhalten dieser proxy-Objekte, wenn eine Methode aufgerufen wird, wird nur zum aufrufen der selben Methode auf die "target" - Bohne (d.h. Ihre bean).
Jedoch die proxies können auch geliefert werden mit Abfangjäger, und wenn diese Abfangjäger werden aufgerufen durch den proxy, bevor Sie ruft Ihre Ziel-bean-Methode. Für Ziel-Bohnen annotiert mit @Transactional, wird der Frühling erstellen Sie eine TransactionInterceptor, und übergeben es an die generierte proxy-Objekt. Also, wenn Sie rufen Sie die Methode von der client-code, Sie sind dem Aufruf der Methode auf dem proxy-Objekt, das die erste ruft den TransactionInterceptor (Beginn einer Transaktion), die wiederum ruft die Methode auf Ihre Ziel-bean. Wenn der Aufruf abgeschlossen ist, wird der TransactionInterceptor commit/Rollback die Transaktion. Es ist transparent für den client-code.
Als für die "externe Methode" was, wenn deine Bohne ruft eine seiner eigenen Methoden, dann wird er nicht zu tun, so dass über den proxy. Denken Sie daran, der Frühling hüllt Ihre bean in der proxy, Ihre Bohne hat keine Kenntnis von Ihr. Nur Anrufe von "außen" Ihre bean über den proxy gehen.
Hilft das?
InformationsquelleAutor der Antwort skaffman
Als eine visuelle person, ich mag zu Wiegen mit einem Sequenz-Diagramm des proxy-Musters. Wenn Sie nicht wissen, wie zu Lesen, die Pfeile, ich Las die ersten einer wie dieser:
Client
führtProxy.method()
.ausgeführt nach der Methode zurückgegeben wird und/oder wenn die Methode wirft eine
Ausnahme
(Durfte ich poste das Foto, unter der Bedingung, dass ich erwähnt seine Ursprünge. Autor: Noel Vaes, website: http://www.noelvaes.eu)
InformationsquelleAutor der Antwort progonkpa
Die einfachste Antwort ist, auf welche Methode Sie declare @Transactional der Grenze Transaktion beginnt, und die Grenze endet, wenn die Methode abgeschlossen ist.
Wenn Sie mit JPA rufen dann alle verpflichtet sind, mit dieser Transaktion-Grenze. Läßt sagen, das Sie speichern, entity1, entity2 und entity3. Jetzt beim speichern entity3 eine Ausnahme auftreten, dann als enitiy1 und entity2 kommt in derselben Transaktion, so entity1 und entity2 wird rollback mit entity3.
Transaktion : (entity1.speichern, entity2.speichern, entity3.speichern). Jede Ausnahme führt ein rollback für alle JPA-Transaktionen mit der DB. Intern JPA Transaktion verwendet werden, die von Frühling.
InformationsquelleAutor der Antwort RoshanKumar Mutha