我无法在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/