【问题标题】:Controlling inner transaction settings from outer transaction with Spring 2.5使用 Spring 2.5 从外部事务控制内部事务设置
【发布时间】:2010-10-01 21:38:33
【问题描述】:

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

Bean1

@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
  }
}

Bean2

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

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

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

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

否则,我想我最好的选择是在新事务中坚持我的失败?我还能做什么清洁?

【问题讨论】:

  • 我不明白它为什么会回滚。您是否在 catch 块中重新抛出异常?
  • 不,我不知道。似乎它正在回滚,因为 Spring TransactionInterceptor 在退出 Bean2 时将事务标记为回滚。
  • 我解决了我的问题,方法是使用 REQUIRES_NEW 传播在新事务中持续失败。但我很想知道是否有更好的解决方案。

标签: spring transactions transactional spring-transactions


【解决方案1】:

这是注释的警告之一...您的类不可重用!

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

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

【讨论】:

  • 谢谢,说得好。无论如何,我的应用程序中的整个事务设置非常糟糕,事务是在 DAO 级别声明的。因此,我仍然有一些嵌入式事务,如问题中所示,但我会在有机会时尝试重构。
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 2014-07-17
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多