Heim Java javaLernprogramm Detaillierte Erläuterung des Java Spring-Transaktions-Rollbacks

Detaillierte Erläuterung des Java Spring-Transaktions-Rollbacks

Jan 23, 2017 am 10:48 AM

Spring-Transaktions-Rollback

1. Aufgetretene Probleme

Wenn wir mehrere Datenbankspeichervorgänge in einer Methode durchführen, tritt ein Fehler im Zwischenvorgang der Datenbank auf. Der Pseudocode lautet wie folgt:

public method() {
  Dao1.save(Person1);
  Dao1.save(Person2);
 
  Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中
  Dao1.save(Person2);
}
Nach dem Login kopieren

Erwartete Situation: Alle Datenbankspeichervorgänge vor dem Auftreten des Fehlers werden zurückgesetzt, d. h. nicht gespeichert.

Normale Situation: Der vorherige Datenbankvorgang wird ausgeführt ausgeführt werden, und alle Datenspeichervorgänge, die bei und nach einem Datenbankbetriebsfehler beginnen, schlagen fehl. Das sollte nicht das Ergebnis sein, das wir wollen.

In dieser Situation können wir Spring-Transaktionen verwenden, um dieses Problem zu lösen.

2. Einige Grundkenntnisse über Ausnahmen

1) Ausnahmearchitektur

Ausnahmevererbungsstruktur: Throwable ist die Basisklasse, Error und Exception erben Throwable, RuntimeException und IOException usw . Erbt Ausnahme. Error und RuntimeException sowie ihre Unterklassen werden zu ungeprüften Ausnahmen (ungeprüft), und andere Ausnahmen werden zu geprüften Ausnahmen (geprüft).

Java Spring 事务回滚详解

2) Fehlerausnahme

Fehler weist darauf hin, dass während der Ausführung des Programms ein sehr schwerwiegender und nicht behebbarer Fehler aufgetreten ist Brechen Sie den Vorgang ab, wenn beispielsweise in der JAVA Virtual Machine ein Fehler auftritt. Fehler ist eine ungeprüfte Ausnahme. Der Compiler prüft nicht, ob der Fehler behandelt wurde, und es besteht keine Notwendigkeit, Ausnahmen vom Typ Fehler im Programm abzufangen. Unter normalen Umständen sollten in Programmen keine Ausnahmen vom Typ Fehler ausgelöst werden.

3) RuntimeException

Ausnahme umfasst RuntimeException und andere Nicht-RuntimeException-Ausnahmen.
RuntimeException ist eine ungeprüfte Ausnahme, was bedeutet, dass der Compiler nicht prüft, ob das Programm RuntimeException verarbeitet. Es besteht keine Notwendigkeit, Ausnahmen vom Typ RuntimException im Programm abzufangen, und es besteht keine Notwendigkeit, die RuntimeException-Klasse in zu deklarieren Methodenkörper. Wenn eine RuntimeException auftritt, bedeutet dies, dass im Programm ein Programmierfehler aufgetreten ist. Daher sollte der Fehler gefunden und das Programm geändert werden, anstatt die RuntimeException abzufangen.

4) Geprüfte Ausnahme

Geprüfte Ausnahme, die auch die am häufigsten verwendete Ausnahme in der Programmierung ist. Alle Ausnahmen, die von Exception erben und keine RuntimeException sind, sind geprüfte Ausnahmen im Bild oben und ClassNotFoundException. Die JAVA-Sprache schreibt vor, dass die geprüfte Ausnahme verarbeitet werden muss und entweder eine geprüfte Ausnahme im Methodenkörper deklariert oder eine Catch-Anweisung verwendet, um die geprüfte Ausnahme zur Verarbeitung zu erfassen.

3. Beispiel

Die hier verwendete Transaktionskonfiguration lautet wie folgt:

<!-- Jpa 事务配置 -->
 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
   <property name="entityManagerFactory" ref="entityManagerFactory"/>
 </bean>
  
 <!-- 开启注解事务 -->
 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
Nach dem Login kopieren

In der Spring-Konfigurationsdatei, wenn die Standardeinstellung „AutoCommit“ lautet Die Datenquelle ist: Wenn sie „True“ ist, wird die Transaktion nicht zurückgesetzt, wenn die Methode die Ausnahme selbst abfängt. Wenn die Ausnahme nicht selbst abgefangen wird, wird die Transaktion zurückgesetzt, wie im folgenden Beispiel
Beispielsweise gibt es einen solchen Eintrag in der Konfigurationsdatei

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
 
<property name="xxx" value="xxx"/>
 
<property name="xxx" value="xxx"/>
 
 ....
 <property name="defaultAutoCommit" value="true" />
 
</bean>
Nach dem Login kopieren

Vielleicht stellen Sie fest, dass Sie diesen Parameter nicht konfiguriert haben. Wird er nicht automatisch übermittelt? , ich verwende hier com.alibaba.druid.pool.DruidDataSource Als Datenbankverbindungspool ist der Standardwert defaultAutoCommit wahr. Sie können den Quellcode unten sehen

Java Spring 事务回滚详解

Dann dort Es gibt jetzt zwei Situationen
Situation 1: Wenn es nicht manuell im Programm erfasst wird Ausnahme

@Transactional(rollbackOn = { Exception.class })
public void test() throws Exception {
   doDbStuff1();
   doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作  会回滚。
}
Nach dem Login kopieren

Situation 2: Wenn wir die Ausnahme selbst im Programm abfangen

@Transactional(rollbackOn = { Exception.class })
public void test() {
   try {
    doDbStuff1();
    doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作 不会回滚。
   } catch (Exception e) {
      e.printStackTrace();  
   }
}
Nach dem Login kopieren

Wenn wir nun die Ausnahme manuell abfangen müssen und sie auch auslösen möchten, was soll ich tun, wenn die Zeit zurückgesetzt werden kann?
Schreiben Sie es einfach so, um die Transaktion manuell rückgängig zu machen:

@Transactional(rollbackOn = { Exception.class })
public void test() {
   try {
    doDbStuff1();
    doDbStuff2();
   } catch (Exception e) {
     e.printStackTrace();  
     TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是这一句了,加上之后,如果doDbStuff2()抛了异常,                                            //doDbStuff1()是会回滚的
   }
}
Nach dem Login kopieren

Vielen Dank fürs Lesen! Danke!

Weitere Artikel zum Java Spring-Transaktions-Rollback finden Sie auf der chinesischen PHP-Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Mar 17, 2025 pm 05:35 PM

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Mar 17, 2025 pm 05:44 PM

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Mar 17, 2025 pm 05:43 PM

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Mar 17, 2025 pm 05:46 PM

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Mar 17, 2025 pm 05:45 PM

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

See all articles