Bevor wir über das Frühlings -Transaktionsmanagement sprechen, überlegen wir uns, wie wir Datenoperationen in Hibernate ausführen, wenn wir keine Spring verwenden. In Hibernate müssen wir zuerst die Transaktion starten, dann Datenvorgänge ausführen, dann die Transaktion einreichen und die Transaktion schließen. Der Grund, warum wir dies tun, ist, dass das automatische Commit von Hibernate falsch ist, dass wir die Transaktion manuell einreichen müssen. Wenn Sie die Transaktion nicht jedes Mal manuell einreichen möchten, können Sie sie so einstellen, dass die Transaktion in meiner Datei hibernate.cfg.xml automatisch festgelegt wird:
XML -Code
<Eigenschaft name = "defaultAutocommit"> <wert> false </value> </Eigenschaft>
Obwohl wir die Methode des Transaktionsausschusses für automatisch festlegen, kann dies Datenvorgänge ausführen. Dies entspricht nicht unseren tatsächlichen Geschäftsanforderungen, da ich manchmal nach dem Speichern von Daten weiterhin weitere Daten speichern kann. Ich hoffe, die Transaktion nach dem Speichern von zwei oder mehr Daten zusammen zu begehen. Auf diese Weise können wir auch wenn ein Fehler vorliegt, die Konsistenz der Daten zurückrollen und sichern. Entweder Erfolg oder Misserfolg. Zu diesem Zeitpunkt können wir die Transaktion nach dem Speichern einer Daten nicht automatisch begehen, da sie nicht in derselben Transaktion sind und die Konsistenz der Daten nicht garantieren können. Zu diesem Zeitpunkt müssen wir also unsere Transaktionen manuell konfigurieren, was die Verwendung des von Spring für Hibernate bereitgestellten Transaktionsmanagementmechanismus erfordert. Das von Spring bereitgestellte Transaktionsmanagement kann in zwei Kategorien unterteilt werden: programmatisch und deklarativ. Die Programmierung wird tatsächlich im Code gesteuert. Genau wie Hibernate Daten betreibt, startet sie Transaktionen und legt Transaktionen ein. Diese Methode hat bestimmte Einschränkungen, daher verwenden wir im Allgemeinen deklarativ, um unsere Transaktionen zu konfigurieren.
Die deklarative Transaktionskonfiguration ist hauptsächlich in die folgenden Schritte unterteilt:
1. Deklarative Transaktionskonfiguration
(1) Konfigurieren des Transaktionsmanagers;
(2) die Ausbreitungseigenschaften der Transaktion;
(3) Diese Klassen und Methoden verwenden Transaktionen.
<!-Konfigurieren Sie die Sitzung, dass der Transaktionsmanager seine Funktion angibt und die Transaktion zu Spring für die Verarbeitung übergeben-> <bean id = "transactionManager"> <Eigenschaft name = "sessionFactory"> <ref bean = "sesactionFactory"/> </property> </bean> <!-Konfigurieren Sie die Propagationsmerkmale der Transaktionen der Transaktionen der Transaktionen der Transaktionen. Transaction-Manager = "TransactionManager"> <tx: Attribute> <tx: Methode name = "speichern*" Propagation = "Erforderlich"/> <tx: method name = "delete*" Propagation = "Erforderlich"/> <tx: method name = "update*" propagation = "erfordert"/> <tx: method name = " name = "*" schreibüberschreitend = "true"/> </tx: Attribute> </tx: Ratschläge> <!-Welche Methoden dieser Klassen nehmen an Transaktionen teil-> <aop: config> <aop: pointcut id = "allServicemethod" Expression = "Ausführung (*com.coe.service. pointcut-ref = "allServicemethod" Ratschläge-ref = "txadvice"/> </aop: config>
Bei der Konfiguration von Transaktionen setzen wir die Transaktionsgrenze normalerweise auf die Serviceschicht, dh Ihre Geschäftslogikschicht, da wir häufig einige unserer Datenspalten in unserer Geschäftslogikschicht abschließen. Wenn die DAO -Datenschicht platziert wird, ist die Granularität zu klein. Wenn wir Transaktionen in der Geschäftslogikschicht konfigurieren, ist dies außerdem für unseren sekundären Cache von Vorteil, den Sie in Zukunft finden, wenn Sie ihn tatsächlich betreiben.
2. Schreiben Sie Business Logic -Methoden
Zu diesem Zeitpunkt können wir die in Hibernatetemplate bereitgestellten Datenbetriebmethoden verwenden, um unsere Geschäftslogikmethoden in unserer Geschäftslogikschicht zu schreiben. Natürlich muss unsere Methode übereinstimmen wie in unserer Transaktionskonfiguration mithilfe von Speichern, Löschen, Aktualisieren und Erhalten als Beginn unserer Methode. Es ist zu beachten, dass die Laufzeitausnahme standardmäßig nur zurückrollt (einschließlich der Erben der RunTimeException -Unterklasse), und gewöhnliche Ausnahmen werden nicht rollen.
Lassen Sie uns schließlich die verschiedenen Ausbreitungsmerkmale von Transaktionen zusammenfassen:
1.. Wenn es keine Transaktion gibt, wird es aktiviert.
2. Ausbreitungen_Supports: Wenn eine Transaktion vorliegt, wird die aktuelle Transaktion unterstützt. Wenn es keine Transaktion gibt, die Ausführung von Nichttransaktionen;
3.. Propagation_Mandatory: Wenn bereits eine Transaktion vorliegt, wird die aktuelle Transaktion unterstützt. Wenn es keine aktive Transaktion gibt, wird eine Ausnahme ausgelöst.
4. Propagation_Requires_New: Öffnen Sie immer eine neue Transaktion. Wenn bereits eine Transaktion besteht, wird die vorhandene Transaktion ausgesetzt.
5. Propagation_Not_Supported: Führen Sie immer nicht transaktionsmäßig aus und setzen Sie jede vorhandene Transaktion aus;
6. Propagation_Never: Wenn eine aktive Transaktion immer nicht transactional ausgeführt wird, wird eine Ausnahme ausgelöst.
7. Propagation_Nested: Wenn eine aktive Transaktion besteht, wird in einer verschachtelten Transaktion ausgeführt. Wenn es keine aktive Transaktion gibt, führen Sie sie gemäß der Transaktiondefinition.Propagation_Required -Eigenschaft aus.
In diesem Artikel hoffe ich, dass es Ihnen helfen kann, das integrierte Transaktionsmanagement von Frühling und Winterschlaf zu verstehen. Vielen Dank für Ihre Unterstützung für diese Website!