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.
Nach dem Verschieben und Überprüfen müssen die folgenden Bedingungen erfüllt sein.
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.
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.
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";
}
}
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