4

我正在使用 Spring 2.5 事务管理,并且我有以下设置:

豆1

@Transactional(noRollbackFor = { Exception.class })
public void execute() {
  try {
    bean2.execute();
  } catch (Exception e) {
    // persist failure in database (so the transaction shouldn't fail)
    // the exception is not re-thrown
  }
}

豆2

@Transactional
public void execute() {
  // do something which throws a RuntimeException
}

故障永远不会从 Bean1 持久化到 DB 中,因为整个事务都回滚了。

我不想在 Bean2 中添加noRollbackFor,因为它用于很多没有逻辑来正确处理运行时异常的地方。

有没有办法避免我的事务仅在从 Bean1 调用 Bean2.execute() 时回滚?

否则,我想我最好的选择是在新交易中坚持我的失败?还有什么我可以做的干净的吗?

4

1 回答 1

1

这是注释的警告之一……您的课程不可重用!

如果您在 XML 中配置您的事务,如果可能的话。

假设您使用 XML 配置:如果它不消耗昂贵的资源,您可以创建另一个 bean2 实例以使用您指定的代码。也就是说,您可以配置一个如您上面指定的那样,一个不回滚异常。

于 2010-10-22T17:35:33.423 回答