【发布时间】:2019-06-09 10:17:32
【问题描述】:
当我在 catch 块中抛出异常时,@Transactional 不会回滚事务。
@Transactional(rollbackFor = MyException.class)
public void testTransactional2() throws Exception {
try {
dao1.save(entity1);
dao2.save(entity2);
arrayList.get(999999); // intentionally cause an exception
} catch (IndexOutOfBoundsException e) {
throw new MyException(ErrorCode.UNABLE_TO_INSERT, e);
}
}
dao1.save() 和 dao2.save() 本身都带有 @Transactional 注释。
当我检查数据库时,我看到两个实体都被持久化了。
【问题讨论】:
-
方法从哪里调用?见:stackoverflow.com/questions/3423972/…
-
你是怎么调用这个方法的,你用的是哪个数据库。
-
这个方法是从同一个类中的另一个方法调用的,它没有被注释为事务。从控制器调用父方法。抛出的异常在那里被捕获,但我已经对其进行了测试但没有捕获 - 结果相同。
-
我在上面发布的链接是相关的。我认为在这种情况下,您实际上执行了 2 个单独的事务——那些在 DAO 级别定义的事务——因为在服务层定义的事务没有效果。
-
如果你从同一个班级调用它,
@Transactional是没用的。两种保存方法都有 2 个事务。在同一个类上调用代理方法将不起作用,因为它们不会通过代理。
标签: spring spring-boot jpa spring-data-jpa transactional