【问题标题】:SpringBoot Transactional annotation Propagation on Class to Class levelSpring Boot Transactional annotation 类到类级别的传播
【发布时间】:2019-12-26 17:10:21
【问题描述】:

我有 3 个类和一些方法, A 类有一个带有

的方法
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

通过这个方法,我调用class2 > methodA
从此方法 class3 methodA 被调用,并在此 method DB 插入操作完成。

class2methodA有一个例外,所以我必须回滚发生在Class3methodA的整个事务。

但没有任何东西回滚。这里有什么遗漏或者我对@TransactionalPropagation 的理解有误吗?

A类

  @Transactional(propagation = Propagation.REQUIRED, 
    rollbackFor = Exception.class)
public class classA {


    public DTObject callUpdateValues(DTObject _dtoobject) throws Exception {
        DTObject _resultDTO = null;
        ClassB m = new ClassB();
        _resultDTO= m.updateValues(_dtoobject);
        return _resultDTO;
    }
}

B类


@Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class )
public class ClassB {

    String Option;

    public ClassB() {
        super();
        // TODO Auto-generated constructor stub
    }
    public DTObject updateValues(DTObject ClassCMap) throws Exception
    {
                addClassC(ClassCMap);
            if(true)    //custom exception
            {
                throw new Exception("Hello exception");
            }
            ReturnResult.setValue( SUCCESS_FAILURE_KEY ,SUCCESS_VALUE);

      return ReturnResult;
    }



    private void addClassC(DTObject dtoobject) throws Exception
        {
            try
            {

              ClassC ClassC = new ClassC();

              ClassCManager ClassCmanager = new ClassCManager(_COLLECTIONObj,V_LOG_REQ,V_ADD_LOG_REQ);

              ClassC.setClassCId(dtoobject.getValue("ClassC_ID"));

              ClassC.setClassCDescn(dtoobject.getValue("ClassC_DESCN"));

              ClassC.setClassCModule(dtoobject.getValue("ClassC_MODULE"));

              ClassC.setClassCClass(Integer.parseInt(dtoobject.getValue("ClassC_CLASS")));

              ClassC.setClassCProgramIdentifier(dtoobject.getValue("ClassC_PROGRAM_IDENTIFIER"));
              char menuStatus=dtoobject.getValue("ClassC_REQUIRED_IN_MENU").charAt(0);

              ClassC.setClassCRequiredInMenu(menuStatus);

              char finStatus=dtoobject.getValue("ClassC_FIN_NONFIN_OPTION").charAt(0);
              ClassC.setClassCFinNonfinOption(finStatus);

              ClassC.setClassCAuthReqd(stringToChar(dtoobject.getValue("ClassC_AUTH_REQD")));

              ClassC.setClassCDblAuthReqd(stringToChar(dtoobject.getValue("ClassC_DBL_AUTH_REQD")));

              ClassC.setClassCTransitChoice(stringToChar(dtoobject.getValue("ClassC_TRANSIT_CHOICE")));

              ClassC.setClassCUnauthNextDay(stringToChar(dtoobject.getValue("ClassC_UNAUTH_NEXT_DAY")));

              ClassC.setClassCRejAllDuringEod(stringToChar(dtoobject.getValue("ClassC_REJ_ALL_DURING_EOD")));

              ClassC.setClassCTableName(dtoobject.getValue("ClassC_REJ_ALL_DURING_EOD"));



              Set_Entd_Dtls(ClassC);

              ClassC.setIsNew(true);



              ClassCmanager.save(ClassC);
            }catch(Exception e)
                {
                    throw new Exception(e.getLocalizedMessage());
                }
        }


}

C类


@Transactional(propagation = Propagation.NESTED)
public class ClassCmanager extends Manager
{



    public void save(Mpgm obj, Connection _conn) throws SQLException {
            CRUD operation
    }

}

【问题讨论】:

  • 不要描述你的代码。发布它。
  • 你有没有从class2 methodA抛出异常?
  • 我在class2-methodA和class3-methodA中没有包含@Transactional,是否需要添加?
  • 如果 class2 是服务类,则添加
  • 贴一些类和方法的声明代码

标签: java spring spring-boot transactions propagation


【解决方案1】:

您需要一个嵌套在 Class2 和 Class3 中的事务,它将使用 Class1 事务。

// Class1
@Transactional(propagation=Propagation.REQUIRED, ...)
// Class2 & Class3
@Transactional(propagation=Propagation.NESTED)

【讨论】:

    【解决方案2】:

    如果您不使用 AspectJ,请尝试将您的课程设为服务(使用 @Service 进行注释)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 2010-12-09
      • 2012-01-19
      • 2015-07-24
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多