【问题标题】:Transactional rollback for caught exception not working [duplicate]捕获异常的事务回滚不起作用[重复]
【发布时间】: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


【解决方案1】:

注意:@Transactional 设置为回滚,默认情况下,仅当引发未经检查的异常时。

同时删除你的 throws 子句,而不是抛出 MyException。

【讨论】:

  • 我从 catch 块中抛出 MyException 并且 @Transactional 设置为 rollbackFor=MyException.class。所以没有问题。
猜你喜欢
  • 2015-03-02
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 2011-10-27
  • 2013-10-16
  • 1970-01-01
  • 2017-09-15
  • 2011-01-17
相关资源
最近更新 更多