当子方法抛出异常时事务不会回滚-Spring

时间:2019-04-08 11:22:48

标签: java spring spring-mvc jdbc

我有一个方法Service方法-SampleServiceImpl()。 我已经声明了Service方法如下:

@Transactional
@Override
public sampleDTO SampleServiceImpl(SampleDTO sampleDTO) throws SampleException, ParseException { 
   // Method call to methodA.
   createDataA(sampleDTO);
   // Method call to methodB.
   createDataB(sampleDTO);

   return sampleDTO ;
}

此处创建了DataA,并且不会引发任何异常。 但是在DataB中,我们试图基于DataA创建DataB。由于某些逻辑,我们无法创建DataB。因此,我们抛出了一个样本异常,如:

count = checkIfDataBExisting(sampleDTO);
if(count == 1){
   throw new SampleException(ErrorConstants.DATA_B_EXISTING);
}

但是问题是,在 createDataA(sampleDTO)方法调用期间提交的事务不会回滚。

为什么这实际上不起作用?我对此行为感到困惑。

编辑:1

createData1(sampleDTO)方法-

private ADTO createDataA(SampleDTO sampleDTO) throws SampleException{
    ADTO aDTO = null;    
    try {
        //CREATE NEW WORK DRIVER
        aDTO = createNewDataA(sampleDTO);

        //Other arbitary database transactions occurs after creation of AData.


} catch (SampleException exc) {
    SampleException newException = new SampleException (exc.getExceptionObject().getExceptionCode(), exc);

    throw newException ;
}
return aDTO;
}

EDIT2:

SampleException声明-

public class SampleException extends Exception{
    //Definitions and Declarations.
}

1 个答案:

答案 0 :(得分:0)

默认情况下,声明性事务回滚仅适用于运行时异常。 SampleException必须为RuntimeException才能回滚事务。

您的方法签名:

public sampleDTO SampleServiceImpl(SampleDTO sampleDTO) throws SampleException, ParseException

让我认为SampleException是经过检查的。

请参见documentation中的@Transactional

  

如果没有与异常相关的规则,它将被视为DefaultTransactionAttribute(在RuntimeException和Error上回滚,但在检查的异常上不回滚)。

您可以使SampleException扩展RuntimeException或设置rollbackFor的{​​{1}}属性。