1. Beispiele für Nutzungsszenarien
Bevor wir verstehen, wie @Transactional verwendet wird, müssen wir zunächst wissen, was @Transactional nützlich ist. Lassen Sie mich Ihnen einen Daumen nach oben geben: Zum Beispiel gibt es viele Mitglieder in einer Abteilung, und diese beiden werden in der Abteilungstisch bzw. in der Mitgliedstabelle gespeichert. Angenommen, wir löschen die entsprechenden Mitglieder standardmäßig. Dies kann jedoch während der Ausführung auftreten. Wir löschen zuerst die Abteilung und löschen dann die Mitglieder. Die Abteilung hat es jedoch erfolgreich gelöscht, und beim Löschen der Mitglieder trat eine Ausnahme auf. Zu diesem Zeitpunkt hoffen wir, dass die zuvor gelöschte Abteilung auch die Löschung storniert, wenn das Mitglied des Mitglieds fehlschlägt. Dieses Szenario kann mit @transactional -Dingen zurückgerollt werden.
2. Überprüfung der Ausnahme und deaktivierte Ausnahme
Der Grund, warum wir alle über die Konzepte überprüfter Ausnahmen und nicht kontrollierter Ausnahmen informieren lassen, ist Folgendes:
Spring verwendet eine deklarative Transaktionsverarbeitung. Wenn eine nicht überprüfte Ausnahme in der kommentierten Datenbankbetriebsmethode auftritt, werden alle Datenbankvorgänge Rollback sein. Wenn die Ausnahme eine geprüfte Ausnahme darstellt, werden die Datenbankvorgänge standardmäßig weiterhin übermittelt.
Überprüfte Ausnahme:
Ungültig, im Programm nicht vorhersehbar. Beispielsweise gibt es keine ungültigen Benutzereingaben, die Datei, keine Netzwerk- oder Datenbankverbindungsfehler. Dies sind alles externe Gründe und werden vom Programm nicht kontrolliert.
Muss explizit im Code behandelt werden. Probieren Sie beispielsweise die Verarbeitung von Block-Catch-Blocks aus oder werfen Sie die Ausnahme in die vorherige Schicht des Anrufstapels mit der Beschreibung der Würfe.
Von java.lang.Exceptionerer geerbt (außer java.lang.runtimeexception).
Unkontrollierte Ausnahme:
Zeigt einen Fehler an, die Logik des Programms ist falsch. Es handelt sich um eine Unterklasse RunTimeException, wie IllegalArgumentException, NullPointerexception und IllegalStateException.
Es ist nicht erforderlich, explizit ungeprüfte Ausnahmen im Code zur Verarbeitung ausdrücklich zu fangen.
Von java.lang.runtimeexception (und java.lang.runtimeexception ererbt er erbt von java.lang.Exception).
Wenn man sich das abnormale Strukturdiagramm unten ansieht, kann es mehr geschichtet sein:
3. Beispiel für die Verwendung von @transactional
Dieses Beispiel verwendet Eclipse+Maven. Maven wird nur als Glas verwaltet, und sogar Affenfreunde von Maven, der es nicht versteht, kann es verstehen.
3.1. Federkonfigurationsdatei
Der TX -Namespace muss zuerst wie folgt konfiguriert werden:
Um @Transactional-basierte Transaktionsverwaltung zu verwenden, ist im Frühjahr die folgende Konfiguration erforderlich:
<bean id = "ApptransactionManager"> <Eigenschaft name = "dataSource" ref = "dataSource" /> < /bean> <tx: Annotationsgesteuerte Proxy-Target-Klasse = "False" transaction-Manager = "ApptransactionManager" />
Die gesamte Frühjahrskonfigurationsdatei des Bloggers:
<? xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.spingframework.org/schema/tx" xmlns: aoop = "http://wwwwww./wwww.Stx XSI: Schemalocation = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/bean http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springFramework.org/schema/context http://www.springframework.org/schema/context/context/context/contex/skonte/conte./ska <!--Introduce jdbc configuration file --> <bean id="propertyConfigurer"> <property name="locations"> <list> <value>classpath:properties/*.properties</value> <!--If there are multiple configuration files, just continue to add them here--> </list> </property> </bean> <!--Configure data source--> <bean id="dataSource" > <!--Configure Eigenschaften-> <!-Eigenschaften konfigurieren-> <!-Eigenschaften konfigurieren-> <!-<Eigenschaft name = "DriverClassName" value = "com.mysql.jdbc.driver" /> <Eigenschaftsname = "url" value = "jdbc: mysql: // lokalhost: 3306 /lern" /> <Stief " /> <Stiefs" /> <Stiefs " /> <Stiefs" /> <Stiefs " /> <Stiefs" /> <Stief " /" usw. " /" userName "" userName "userName" username ". value = "heilig258@"/>-> <!-Verwenden Sie Eigenschaften, um-> <Eigenschaft name = "triverClassName"> <value> $ {JDBC_DRIVERCLASSNAME} </value> </Property> <Immobilienname = "url"> <value> $ {jdbc_url} </value> </value> </value> </value> </</</</</</</</</</</</</</</</</</</</</</Prob. <value>${jdbc_username}</value> </property> <property name="password"> <value>${jdbc_password}</value> </property> </bean> <bean id="appTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven proxy-target-class = "false" transaction-Manager = "ApptransactionManager" /> <!-SCRACKEN SIE ALLE MAPPER-Schnittstellendateien, die XXXXMapper.xml entsprechen, so dass Sie nicht die MPPER-Zuordnung voneinander manuell konfigurieren müssen. Solange die Mapper -Schnittstellenklasse und die Mapper -Zuordnungsdatei einander entsprechen. -> <bean> <Eigenschaft name = "Basepackage" value = "com.luo.dao" /> < /bean> <!-Konfigurieren Sie die MyBatis-Datei, MapperLocations konfigurieren ** mapper.xml Dateisposition, configLocation configure myBatis-config-Datei-Datei-Datei-Datei-Datei-Datei-Datei-Datei- und SQLSessionfactory "<Bean" datasourcing = " <Eigenschaft name = "mapperlocations" value = "classPath: mapper/*. xml"/> <Eigenschaft name = "configLocation" value = "classPath: mybatis/mybatis-config.xml"/> <!-<Stief name = "typealiaSespack" value = "com.tiantian <Kontext: Komponenten-scan-Basis-Package = "com.luo.service" /> < /beans>3.2. Verwenden Sie @Transactional, um der Methode der Benutzer -Implementierungsklasse Annotationen hinzuzufügen
@Transactional (Propagation = Propagation.Required) public void adduser (Benutzer Benutzer) {userDao.adduser (Benutzer); String string = null; if (string.equals ("")) {int i = 0; }}In der obigen Methode habe ich absichtlich eine Nullzeiger -Ausnahme und die Dinge zurückrollen
3.3. Führen Sie die Unit -Testklasse aus
@Test public void addUsertest () {user user = new user (); user.setUnername ("luoguohui1"); user.setUserPassword ("luoguohui1"); UserService.adduser (Benutzer);}Ich fand heraus, dass es nicht eingefügt werden konnte, aber wenn @transactional entfernt wird, ist der Code wie folgt. Obwohl eine Ausnahme auftritt, werden in der Datenbank noch entsprechende Daten hinzugefügt:
3.4. Quellcode herunterladen
Laden Sie den endgültigen Quellcode dieses Artikels herunter: First_Maven_Project_jb51.rar
4. Konzepte, die @transactional im Frühjahr verstanden werden müssen
@Transactional im Frühjahr basiert auf dem dynamischen Proxy -Mechanismus und bietet einen transparenten Transaktionsmanagementmechanismus, um Probleme zu erleichtern und schnell zu lösen, die in der Entwicklung auftreten.
Im Allgemeinen können Methoden oder Schnittstellen oder Klassen durch den folgenden Code kommentieren:
@Transactional (Propagation = Propagation.not_Supported)
Die Ausbreitung unterstützt 7 verschiedene Ausbreitungsmechanismen:
Erforderlich: Wenn eine Transaktion besteht, wird die aktuelle Transaktion unterstützt. Wenn es keine Transaktion gibt, wird eine neue Transaktion gestartet.
Unterstützung: Wenn eine Transaktion besteht, wird die aktuelle Transaktion unterstützt. Wenn es keine Transaktion gibt, die Ausführung der Nichttransaktion. Für Transaktionssynchronisations -Transaktionsmanager unterscheidet sich jedoch die Propagation_Supports geringfügig von der Verwendung von Transaktionen.
Not_Supported: Führen Sie immer nicht transaktional aus und setzen Sie vorhandene Transaktionen aus.
BenötigtNew: Starten Sie immer eine neue Transaktion. Wenn bereits eine Transaktion besteht, wird die vorhandene Transaktion ausgesetzt.
Obligatorisch: Wenn bereits eine Transaktion besteht, unterstützen Sie die aktuelle Transaktion. Wenn es keine aktive Transaktion gibt, wird eine Ausnahme ausgelöst.
Niemals: Führen Sie immer Nicht-Transaktional aus, wenn eine aktive Transaktion besteht, wird eine Ausnahme ausgelöst
Verschachtelt: Wenn eine aktive Transaktion besteht, wird in einer verschachtelten Transaktion ausgeführt. Wenn keine aktive Transaktion vorliegt, drücken Sie die erforderliche Eigenschaft, um auszuführen.
Hier sind einige Dinge zu beachten, die gelesen werden müssen. Andernfalls hat der Blogger Sie nicht daran erinnert:
Hier sind einige Dinge zu beachten, die gelesen werden müssen. Andernfalls hat der Blogger Sie nicht daran erinnert:
Hier sind einige Dinge zu beachten, die gelesen werden müssen. Andernfalls hat der Blogger Sie nicht daran erinnert:
Fügen Sie @Transactional Annotation hinzu, wo eine Transaktionsverwaltung erforderlich ist. @Transactional Annotations können auf Schnittstellendefinitionen und Schnittstellenmethoden, Klassendefinitionen und öffentliche Klassenmethoden angewendet werden.
@Transactional Annotations können nur auf Methoden mit öffentlicher Sichtbarkeit angewendet werden. Wenn Sie @Transactional Annotation bei geschützten, privaten oder paket zu sichtbaren Methoden verwenden, meldet sie keinen Fehler. Diese kommentierte Methode zeigt jedoch nicht die konfigurierten Transaktionseinstellungen an.
Beachten Sie, dass das Auftreten der @Transactional -Annotation nicht ausreicht, um das Transaktionsverhalten zu ermöglichen, sondern nur eine Art Metadaten. Das Konfigurationselement muss in der Konfigurationsdatei verwendet werden, um das Transaktionsverhalten wirklich zu aktivieren.
Steuert, ob ein interfacebasierter oder klassenbasierter Proxy über den Attributwert "Proxy-Target-Klasse" des Elements erstellt wird. Wenn der Genre-Wert "Proxy-Target-Klasse" auf "true" eingestellt ist, funktioniert der klassenbasierte Proxy (dies ist erforderlich, um cGlib.jar im Klassenpfad). Wenn der Genre-Wert "Proxy-Target-Klasse" auf "False" oder diese Eigenschaft weggelassen wird, funktioniert der Standard-Proxy mit der Standard-JDK-Schnittstelle.
Das Spring -Team empfiehlt, @Transactional Annotation an bestimmten Klassen (oder Methoden der Klassen) zu verwenden, anstatt auf Schnittstellen, die die Klasse implementieren möchte. Die Verwendung der @Transactional-Annotation auf einer Schnittstelle wird nur dann wirksam, wenn Sie einen interface-basierten Proxy einrichten. Da Anmerkungen nicht vererbt werden können, bedeutet dies, dass die Transaktionseinstellungen, wenn ein klassenbasierter Proxy verwendet wird, von dem klassenbasierten Proxy nicht erkannt werden und das Objekt nicht vom Transaktionsproxy verpackt wird.
Die Transaktion von @Transactional ist aktiviert, entweder eine interface-basierte oder ein klassenbasierter Proxy wird erstellt. In derselben Klasse ruft eine Methode eine andere Methode mit Transaktionen auf, und die Transaktion funktioniert nicht.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.