[JAVA] So funktioniert @Transactional, das nicht funktioniert, wenn Sie es falsch verwenden

Die Spring-Annotation "@ @ Transactional``` "ist praktisch, da sie eine Transaktion automatisch ausführt, indem sie an eine Methode angehängt wird, und ein Rollback durchführt, wenn standardmäßig eine RuntimeException auftritt. Es gibt jedoch Fälle, in denen die Transaktion nicht einfach durch Hinzufügen von "@ Transactional" ausgeführt werden kann und keinen Erstellungsfehler verursacht. Als ich sie tatsächlich verschoben habe, wurde die Transaktion nicht ausgeführt. Also habe ich zusammengefasst, wie man ``@ Transactional``` zum Arbeiten verwendet.

Bedingungen, unter denen `` `@ Transactional``` funktioniert

Nach dem Verschieben und Überprüfen müssen die folgenden Bedingungen erfüllt sein.

Öffentliche Methode der DI-Klasse

Es gibt auch eine Möglichkeit, die Bean-Definitionsdatei als Methode zum DI der Klasse zu verwenden. Hier wird jedoch die Implementierung mithilfe der Spring-Annotation beschrieben.

ServiceClass.java


@Service
public class ServiceClass {

    @Transactional
	public void updateDB() {
    	//DB-Aktualisierungsprozess
	}
}

Oben ist @ Service``` an die Klasse angehängt, aber auch andere Annotationen, die DI ausführen, wie @ Controller und `` @ Repository, funktionieren ebenfalls.

Rufen Sie direkt von einer anderen Klasse an, die DI ist

Die Klasse, die die obige ServiceClass aufruft, lautet wie folgt.

ControllerClass.java


@RequestMapping("/sample/*")
@Controller
public class ControllerClass {

	@Autowired
	ServiceClass serviceClass;

    @RequestMapping(value = { "index" })
    public String index(){
    	serviceClass.updateDB();

        return "sample/index";
    }
}

Dies ist auch eine Klasse, die DI mit `` `@ Controllerist.@autowired```Die Transaktion erstellt automatisch eine Instanz der Serviceklasse unter Verwendung der aufgerufenen b-Methode und ruft diese auf.

Rufen Sie direkt vom Framework aus an

Es funktioniert auch, wenn eine Methode mit `` @ Transactional``` aus dem Spring-Framework aufgerufen wird. In den folgenden Fällen wird die Transaktion ausgeführt, wenn die Anforderung, die der Einstellung von "@ RequestMapping" entspricht, eingeht und die Methode aufgerufen wird.

ControllerClass.java


@RequestMapping("/sample/*")
@Controller
public class ControllerClass {

    @Autowired
    ServiceClass serviceClass;

    @RequestMapping(value = { "index" })
    @Transactional
    public String index(){
        serviceClass.updateDB();

        return "sample/index";
    }
}

ServiceClass.java


@Service
public class ServiceClass {

    public void updateDB() {
        //DB-Aktualisierungsprozess
    }
}

Darüber hinaus funktioniert die Transaktion auf dieselbe Weise, wenn die Methode aufgerufen wird, indem die Zeit mit "@ Scheduled" angegeben wird.

ControllerClass.java


@Controller
public class ControllerClass {

    @Autowired
    ServiceClass serviceClass;

    @Scheduled(cron = "0 0 10 * * *")
    @Transactional
    public String index(){
        serviceClass.updateDB();

        return "sample/index";
    }
}

Implementierungsbeispiel

In Anbetracht einer praktischen Implementierung möchte ich ein Rollback durchführen, auch wenn eine andere Ausnahme als RuntimeException auftritt.

@Transactional(rollbackFor = Exception.class)Legen Sie fest, dass Ausnahmen und Klassen, die Ausnahmen erben, beim Auslösen zurückgesetzt werden.


 Versuchen Sie es mit der aufrufenden Methode und teilen Sie den Prozess nach Erfolg oder Misserfolg auf.


#### **`ControllerClass.java`**
```java

@RequestMapping("/sample/*")
@Controller
public class ControllerClass {

    @Autowired
    ServiceClass serviceClass;

    @RequestMapping(value = { "exec" })
    public String exec(Model model){

        try {
            //Aufruf einer Methode, die eine Transaktion ausführt
            serviceClass.transaction();

            //Was tun, wenn erfolgreich?
            model.addAttribute("message", "Der Prozess war erfolgreich.");
        } catch (Exception e) {
            //Verarbeitung bei fehlgeschlagener Verarbeitung
            if (e.getMessage() != null) {
                 model.addAttribute("message", e.getMessage());
            } else {
                 model.addAttribute("message", "Ein Fehler ist aufgetreten.");
            }
            return "sample/index";
        }
        return "sample/complete";
    }
}

ServiceClass.java


@Service
public class ServiceClass {

    @Transactional(rollbackFor = Exception.class)
    public void transaction() throws Exception {
        //Eine Reihe von Prozessen, die Sie transaktionieren möchten
        //Wenn Sie einen Rollback durchführen möchten, lösen Sie eine Ausnahme aus, wie unten gezeigt
        throw new Exception("Verarbeitung gescheitert.");
    }
}

Recommended Posts

So funktioniert @Transactional, das nicht funktioniert, wenn Sie es falsch verwenden
MockMVC gibt 200 zurück, auch wenn ich eine Anfrage an einen Pfad stelle, der nicht existiert
So ersetzen Sie Zeichen, die Sie nicht verstehen [Prinzip]
Wenn Sie eine Java-Anwendung in ein Docker-Image verwandeln möchten, ist es praktisch, Jib zu verwenden.
So lösen Sie das Problem, dass Aptana Studio nicht gestartet wird
So interagieren Sie mit einem Server, der die App nicht zum Absturz bringt
[Fehler] So beheben Sie das Phänomen, dass der Bildschirm nach der Bearbeitung nicht wechselt
[Spring Boot] Wenn Sie Spring Boot verwenden, war es praktisch, viele Dienstprogramme zu verwenden.
Wenn @Transactional of Spring Boot nicht funktioniert
Wenn Sie SQLite mit VSCode verwenden, verwenden Sie die Erweiterung (wie die Binärdatei von sqlite3 angezeigt wird)
Was tun, wenn die Annotation JSON Hint nicht mit Lombok und JSONIC funktioniert?
Wie man Maven benutzt, das ich nicht mehr hören kann
Wenn in Ruby Hash [: a] [: b] [: c] = 0 ist, möchten wir, dass Sie rekursiv erweitern, auch wenn der Schlüssel nicht vorhanden ist
[Ruby] Verwendung von rbenv (Version `x.x.x' ist nicht installiert)
So funktioniert JavaScript auf einer bestimmten Seite
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
So erstellen Sie ein Glas mit dem alten Hadoop (hadoop-core-0.20.2-cdh3u6) in Gradle: (Was tun, wenn Sie ZIP nicht erweitern können?)
Was tun, wenn Sie Ruby mit rbenv installiert haben, die Version sich jedoch nicht ändert?
Notiz, die zum Anmeldebildschirm übergeht, wenn Sie nicht mit devise angemeldet sind
Verwendung von Map
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man ein schattiertes Glas macht
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
[Rails] Behebung des Problems, dass das Sitzungszeitlimit nicht funktioniert
Bequeme Verwendung von Map, die Sie nicht unerwartet kennen
So erhalten Sie das Protokoll, wenn install4j nicht gestartet wird
Was tun, wenn der Befehl Rails unbrauchbar wird?