@Transactional Service方法,两个DAO从参数化接口实现



我无法在Spring Boot 2.1.4中回滚交易,涉及两个Daos(JDBC(。DAO实现了一个参数化接口。第一个DAO将记录插入三张桌子,最后一个DAO将记录插入一张桌子。我正在强迫最后的DAO插入失败。

数据库是db2。

一些代码:

public interface FooDao<T extends Foo> {
    int insert(T foo) throws SQLException;
}
@Repository
public class FooDaoJdbc implements FooDao {
    @Override
    public int insert(Foo foo) throws SQLException {
        insertFoo(foo);
        insertFooDescriptions(foo);
        insertFooActivity(foo);
        return 0;
    }
}
@Repository
public class BazDaoJdbc implements FooDao<Baz>  {
    @Override
    public int insert(Baz baz) throws SQLException {
public interface FooService<T extends Foo> {
    void add(T foo) throws SQLException;
}
@Service
public class BazServiceImpl implements FooService<Baz> {
    private FooDao<Baz> bazDaoJdbc;
    private FooDao<Foo> fooDaoJdbc;
    @Transactional(rollbackFor = Exception.class)
    public void add(Baz baz) throws SQLException {
                fooDaoJdbc.insert(foo);
        bazDaoJdbc.insert(baz);        
        }
}

当我调试Transactectepectsupport时,Foodaojdbc和Bazdaojdbc似乎处于同一交易中,但是回滚似乎忽略了foodaojdbc。我没有" BAZ"表中的记录,但我希望三个" Foo"桌子也会回滚。此时我的眼睛杂交。我有放错的注释吗?我是在用仿制药做"幻想"吗?预先感谢您的帮助!

@Transactional方法仅在不选中的异常时回滚。因此,当抛出异常时,您必须将RuntimeException扔在添加方法中。

@Service
public class BazServiceImpl implements FooService<Baz> {
    private FooDao<Baz> bazDaoJdbc;
    private FooDao<Foo> fooDaoJdbc;
@Transactional
    public void add(Baz baz) {
     try {
            fooDaoJdbc.insert(foo);
            bazDaoJdbc.insert(baz);   
        } catch (Exception e) {
         throw new RuntimeException(e.getMessage());
        }     
    }
}

更多信息: https://www.catalysts.cc/wissenswertes/spring-transactional-rollback-on-checked-exceptions/

最新更新