@Transactional注解的方法之间调用导致注解失效的问题

一  前言、

        在上一篇文章中,讲述了@Transactional注解方法内使用try catch导致注解失效的问题,今天,在处理方法之间调用时也存在关于@Transactional注解失效的问题,在这里简单记录下。

        try catch导致@Transactional注解失效文章地址:https://blog.csdn.net/qq_65642052/article/details/133174164?spm=1001.2014.3001.5502

二  问题描述

        大家在写代码过程中,或多或少会遇到如下问题:service层中有:类A中存在方法TestA,类B中存在方法TestB,类C中存在方法TestC,方法Test调用TestA,TestB,TestC,TestA、B、C均涉及数据库操作,要求:当任意一个方法发生错误时,TestA、B、C三个方法对数据库操作全部回滚;

public void Test(){
    A.TestA();
    B.TestB();
    C.TestC();
}

        那么大家认为@Transactional注解应该怎么加?加在哪里?

三 解决方法

        经过我的测试情况如下:

        (1)@Transactional注解注解加在Test()上,TestA、B、C不加@Transactional注解,数据库回滚情况:如果在testA()testB()testC()中的任何一个方法发生异常,会导致整个test方法的数据库操作回滚。

@Transactional
public void Test() {
    A.TestA();
    B.TestB();
    C.TestC();
}

        (2)@Transactional同时在Test方法和TestA()TestB()TestC()方法上添加:数据库回滚情况:无论是在Test()方法还是TestA()TestB()TestC()方法中发生异常,都会导致整个事务中的数据库操作回滚。

@Transactional
public void Test() {
    TestA();
    TestB();
    TestC();
}

@Transactional
public void TestA() {
    // ...
}

@Transactional
public void TestB() {
    // ...
}

@Transactional
public void TestC() {
    // ...
}

        (3) @Transactional仅在TestA()TestB()TestC()方法上添加:数据库回滚情况:如果在TestA()TestB()TestC()中的任何一个方法发生异常,会导致这个方法内的数据库操作回滚,但不会影响到Test()方法。简单来说:C发生错误,C会回滚,A、B却不会回滚。

public void Test() {
    TestA();
    TestB();
    TestC();
}

@Transactional
public void TestA() {
    // ...
}

@Transactional
public void TestB() {
    // ...
}

@Transactional
public void TestC() {
    // ...
}

四  总结 

        对于上面三种情况,建议使用第二种方式,在Test方法和TestA()TestB()TestC()方法上同时添加@Transactional注解。这样可以确保无论是在哪个方法中发生异常,整个事务中的数据库操作都会回滚,保持数据的一致性。

猜你喜欢

转载自blog.csdn.net/qq_65642052/article/details/133275050