Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在子方法-Spring中引发异常时,事务未回滚_Java_Spring_Spring Mvc_Jdbc - Fatal编程技术网

Java 在子方法-Spring中引发异常时,事务未回滚

Java 在子方法-Spring中引发异常时,事务未回滚,java,spring,spring-mvc,jdbc,Java,Spring,Spring Mvc,Jdbc,我有一个方法服务方法-SampleServiceImpl()。 我已声明服务方法如下: @Transactional @Override public sampleDTO SampleServiceImpl(SampleDTO sampleDTO) throws SampleException, ParseException { // Method call to methodA. createDataA(sampleDTO); // Method call to metho

我有一个方法服务方法-SampleServiceImpl()。 我已声明服务方法如下:

@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。由于某些逻辑,我们无法创建数据。因此,我们抛出一个示例异常,如:

count = checkIfDataBExisting(sampleDTO);
if(count == 1){
   throw new SampleException(ErrorConstants.DATA_B_EXISTING);
}
但问题是,在createDataA(sampleDTO)方法调用期间提交的事务不会回滚

为什么这实际上不起作用?我对这种行为有点困惑

编辑:1

createData1(sampleDTO)方法-

EDIT2:

样本例外声明-


默认情况下,声明性事务仅针对运行时异常回滚。 SampleException必须是RuntimeException才能回滚事务

您的方法签名:

public sampleDTO sampleservicecimpl(sampleDTO sampleDTO)抛出SampleException、ParseException

让我觉得SampleException是一个选中的异常

有关
@Transactional
,请参见:

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


您可以创建
SampleException
extends
RuntimeException
或设置
@Transactional

rollboor
属性,是否可以粘贴方法
createDataA
?显示
createDataA
方法,您是否在默认情况下将自动提交设置为false?@Andronicus-我已为您的引用重新创建了createDataA()方法。您使用的数据库和表类型是否支持事务?如果您使用的是MySQL,请确保不要使用MyISAM表,因为它们不支持事务。@M.Deinum Yes DB支持事务。我在这里使用oracle。我还添加了SampleException声明。我也尝试过将rollback属性设置为SampleException.class,比如-->rollboor=SampleException.class,但它不起作用。
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;
}
public class SampleException extends Exception{
    //Definitions and Declarations.
}