我有一个方法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.
}
答案 0 :(得分:0)
默认情况下,声明性事务回滚仅适用于运行时异常。 SampleException必须为RuntimeException才能回滚事务。
您的方法签名:
public sampleDTO SampleServiceImpl(SampleDTO sampleDTO) throws SampleException, ParseException
让我认为SampleException是经过检查的。
请参见documentation中的@Transactional
:
如果没有与异常相关的规则,它将被视为DefaultTransactionAttribute(在RuntimeException和Error上回滚,但在检查的异常上不回滚)。
您可以使SampleException
扩展RuntimeException
或设置rollbackFor
的{{1}}属性。