Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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 无法回滚已检查异常的事务_Java_Spring_Hibernate_Transactional_Atomicity - Fatal编程技术网

Java 无法回滚已检查异常的事务

Java 无法回滚已检查异常的事务,java,spring,hibernate,transactional,atomicity,Java,Spring,Hibernate,Transactional,Atomicity,尽管我已将MyServiceImpl标记为@Transactional(rollbackFor=IllegalStateException.class),但如果引发了IllegalStateException,则以下服务无法回滚持久化Foo对象。我还尝试将upload方法标记为@Transactional(rollboor=IllegalStateException.class),但问题仍然存在,如果发生IllegalStateException,我的数据库状态将不一致: @Service @T

尽管我已将MyServiceImpl标记为
@Transactional(rollbackFor=IllegalStateException.class)
,但如果引发了
IllegalStateException
,则以下服务无法回滚持久化
Foo
对象。我还尝试将
upload
方法标记为
@Transactional(rollboor=IllegalStateException.class)
,但问题仍然存在,如果发生
IllegalStateException
,我的数据库状态将不一致:

@Service
@Transactional
public class MyServiceImpl implements IMyService{
    @Autowired
    private IFooService fooService;
    @Autowired
    private IBarService barService;

    @Override
    @Transactional(rollbackFor = IllegalStateException.class, propagation = Propagation.REQUIRED)
    public void upload(Foo foo, Bar bar) throws IllegalStateException{
       try{
        fooService.addFoo(foo);//foo object is persisted in the DB whether the upload call would succeed or fail (i.e. throws an IllegalStateException)
        if(!check(bar))
            throw new IllegalStateException("The object bar is not valid");
        barService.addBar();
      } catch(Exception e){
           e.printStackTrace();
      }
    }

    //This method simply validates the input Bar object
    private boolean check(Bar bar){
        //source code omitted       
    }   
}

@Service
@Transactional
public class FooServiceImpl implements IFooService{
    @Autowired
    private IFooDao fooDao; 

    @Override
    @Transactional(propagation = Propagation.REQUIRED) 
    public void addFoo(final Foo foo){
        fooDao.addFoo(foo);
    }   
}

@Service
@Transactional
public class BarServiceImpl implements IBarService{
    @Autowired
    private IBarDao barDao;

    @Override
    @Transactional(propagation = Propagation.REQUIRED) 
    public void addBar(final Bar bar){
        barDao.addBar(bar);
    }
}

public class Foo implements Serializable{
    private int id;
    //source code omitted
}

public class Bar implements Serializable{
    private int id;
    private Foo foo;
    //source code omitted
}
我的数据源配置:

@Bean(name="dataSource")
public ComboPooledDataSource getDataSource() throws PropertyVetoException{
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setDriverClass(env.getProperty("db.driverClass"));
    dataSource.setJdbcUrl(env.getProperty("db.jdbcUrl"));
    dataSource.setUser(env.getProperty("db.user"));
    dataSource.setPassword(env.getProperty("db.password"));
    dataSource.setMaxPoolSize(50);
    dataSource.setMinPoolSize(5);
    dataSource.setMaxConnectionAge(1800);
    dataSource.setMaxIdleTime(1800);        
    dataSource.setAutoCommitOnClose(false);
    dataSource.setInitialPoolSize(5);       
    return dataSource;
}
我怎样才能解决这个问题


UPDATE:源代码已更新,并添加了
try/catch
子句。

看起来像是
addFoo
在自己的事务中执行

您可以使用

@Transactional(propagation = Propagation.REQUIRED)

因此,在这种情况下,它将使用相同的事务,如果在没有@Transactional注释的情况下从其他地方调用,则会创建一个新事务。

我花了一段时间才发现回滚失败的原因。谢谢你的回答。事实上,我提供的源代码并不完全。我忘了在
upload
方法中添加
try/catch
子句。尽管抛出了
IllegalStateException
,但这确实阻止了事务回滚。除此之外,我不需要指定传播级别,因为默认情况下它是
必需的