L'annotation Spring "
@ Transactional" est pratique car elle exécute automatiquement une transaction simplement en l'attachant à une méthode et revient en arrière lorsqu'une RuntimeException se produit par défaut. Cependant, il y a des cas où la transaction ne peut pas être effectuée simplement en ajoutant `` `` @ Transactional
, et cela ne provoque pas d'erreur de construction, donc lorsque je l'ai déplacée, la transaction n'a pas été effectuée.
Donc, j'ai résumé comment utiliser `` @ Transactional '' pour travailler.
Après l'avoir déplacé et vérifié, il semble que les conditions suivantes doivent être remplies.
--Il doit s'agir d'une méthode publique de la classe dans laquelle vous êtes DI
Il existe également une méthode d'utilisation du fichier de définition Bean comme méthode de DI de la classe, mais nous décrirons ici l'implémentation à l'aide de l'annotation Spring.
ServiceClass.java
@Service
public class ServiceClass {
@Transactional
public void updateDB() {
//Processus de mise à jour de la base de données
}
}
Dans ce qui précède, @ Service '' est attaché à la classe, mais d'autres annotations qui effectuent des DI telles que
@ Controller '' et `` @ Repository '' fonctionneront également.
La classe qui appelle le ServiceClass ci-dessus est la suivante.
ControllerClass.java
@RequestMapping("/sample/*")
@Controller
public class ControllerClass {
@Autowired
ServiceClass serviceClass;
@RequestMapping(value = { "index" })
public String index(){
serviceClass.updateDB();
return "sample/index";
}
}
C'est aussi une classe qui utilise `` @ Controller '' pour DI.
@autowired
La transaction fonctionne en créant automatiquement une instance de serviceclass à l'aide et en appelant la méthode updatedb.
Cela fonctionne également lorsqu'une méthode avec @ Transactional '' est appelée à partir du framework Spring. Dans les cas suivants, la transaction sera exécutée lorsque la requête correspondant au paramètre de
@ RequestMapping '' arrive et que la méthode est appelée.
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() {
//Processus de mise à jour de la base de données
}
}
De plus, la transaction fonctionne de la même manière lorsque la méthode est appelée en spécifiant l'heure par
@ Scheduled```.
ControllerClass.java
@Controller
public class ControllerClass {
@Autowired
ServiceClass serviceClass;
@Scheduled(cron = "0 0 10 * * *")
@Transactional
public String index(){
serviceClass.updateDB();
return "sample/index";
}
}
Compte tenu d'une implémentation pratique, je souhaite revenir en arrière même si une exception autre que RuntimeException se produit.
@Transactional(rollbackFor = Exception.class)Définissez Exception et les classes qui héritent d'Exception pour être annulées lors de la levée.
Essayez-le avec la méthode appelante et divisez le processus en fonction du succès ou de l'échec.
#### **`ControllerClass.java`**
```java
@RequestMapping("/sample/*")
@Controller
public class ControllerClass {
@Autowired
ServiceClass serviceClass;
@RequestMapping(value = { "exec" })
public String exec(Model model){
try {
//Appeler une méthode qui effectue une transaction
serviceClass.transaction();
//Que faire en cas de succès
model.addAttribute("message", "Le processus a réussi.");
} catch (Exception e) {
//Traitement en cas d'échec du traitement
if (e.getMessage() != null) {
model.addAttribute("message", e.getMessage());
} else {
model.addAttribute("message", "Une erreur est survenue.");
}
return "sample/index";
}
return "sample/complete";
}
}
ServiceClass.java
@Service
public class ServiceClass {
@Transactional(rollbackFor = Exception.class)
public void transaction() throws Exception {
//Une série de processus que vous souhaitez transiger
//Si vous souhaitez revenir en arrière, lancez une exception comme indiqué ci-dessous
throw new Exception("Le traitement a échoué.");
}
}
Recommended Posts