[JAVA] Comment faire fonctionner @Transactional qui ne fonctionne pas si vous ne l'utilisez pas correctement

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.

Conditions pour que `` @ Transactional '' fonctionne

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

Méthode publique de la classe 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.

Appelez directement depuis une autre classe qui est DI

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. @autowiredLa transaction fonctionne en créant automatiquement une instance de serviceclass à l'aide et en appelant la méthode updatedb.

Appelez directement depuis le framework

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";
    }
}

Exemple d'implémentation

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

Comment faire fonctionner @Transactional qui ne fonctionne pas si vous ne l'utilisez pas correctement
MockMVC renvoie 200 même si je fais une demande vers un chemin qui n'existe pas
Comment remplacer des caractères que vous ne comprenez pas [Principe]
Si vous souhaitez transformer une application Java en une image Docker, il est pratique d'utiliser jib.
Comment résoudre le problème qu'Aptana Studio ne démarre pas
Comment interagir avec un serveur qui ne plante pas l'application
[Erreur] Comment résoudre le phénomène selon lequel l'écran ne passe pas après l'édition
[Spring Boot] Si vous utilisez Spring Boot, il était pratique d'utiliser de nombreux utilitaires.
Lorsque @Transactional of Spring Boot ne fonctionne pas
Si vous utilisez SQLite avec VSCode, utilisez l'extension (comment voir le fichier binaire de sqlite3)
Que faire si l'annotation JSON Hint ne fonctionne pas avec Lombok et JSONIC
Comment utiliser Maven que je n'entends plus
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
[Ruby] Comment utiliser rbenv (la version `x.x.x 'n'est pas installée)
Comment faire fonctionner JavaScript sur une page spécifique
Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin
Comment faire un pot avec l'ancien Hadoop (hadoop-core-0.20.2-cdh3u6) dans Gradle: (Que faire si vous obtenez Impossible de développer ZIP ..)
Que faire si vous avez installé Ruby avec rbenv mais que la version ne change pas
Mémo qui passe à l'écran de connexion si vous n'êtes pas connecté avec l'appareil
Comment utiliser Map
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment faire un pot ombré
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
[Rails] Résolution du problème selon lequel le délai d'expiration de la session ne fonctionne pas
Utilisation pratique de Map que vous ne connaissez pas de manière inattendue
Comment obtenir le journal lorsque install4j ne démarre pas
Que faire si la commande rails devient inutilisable