【问题标题】:Spring AOP Transaction Management and Hibernate: undesired commits to databaseSpring AOP 事务管理和 Hibernate:对数据库的不希望提交
【发布时间】:2011-10-28 14:54:15
【问题描述】:

是否可以为仅调用 DAO(数据访问对象)方法的方法启用事务?

class BusinessLayerFacade implements Facade {

//no transaction handling allowed here
public X foo() {
    //do something
}

public Y changed(DomainObject myObject) {
    //do something
    //<-- start transaction
    // calling DAO 
    //do something
    // calling DAO
    //<-- end transaction
}

}

BusinessLayerFacade 中的所有方法允许事务会导致一些不希望的提交到数据库。例如。当调用 foo() 并在执行 changed(DomainObject myObject) 时抛出 Exception 时,myObject 已提交到数据库,而不是在事务回滚时恢复更改。

有什么想法吗?

这无疑是一个按名称过滤方法的选项但是我们可以在里面放更多的魔法吗 ;-) 是否可以在第一次调用 DAO 方法时启动事务in changed() 并在 changed() 返回时开始提交。如果这是可能的,我在类中命名新方法时不必小心。

谢谢,斯特凡

【问题讨论】:

  • 刷新和事务提交不一样。 Hibernate 可以决定在事务期间进行刷新 - 只是为了同步其会话和数据库状态。 hibernate 可以决定进行刷新然后回滚事务。
  • 我在我的问题中更正了这一点。感谢您的建议!

标签: java hibernate spring transactions aop


【解决方案1】:

如果抛出运行时异常,事务将回滚。如果抛出应用程序异常,则不会。您可以通过应用注解 @Transactional 来自定义它:

@Transactional(rollbackFor=SomeException.class, noRollbackFor=SomeOtherException.class)

这也可以在 XML 中全局自定义,使用 tx:method 元素的 rollback-forno-rollback-for 属性。

阅读Spring reference documentation了解更多详情。

【讨论】:

  • 注释方法使 AOP 无关
  • 不,它没有。它只是使自定义方面应该为特定方法执行的操作变得容易。如果要全局定义行为,请使用 XML 属性,如我的回答中所述。
  • 注释使事情易于定制是一个有争议的问题。如果他使用注释,他就不需要 AOP,因此无关紧要。即使 TX 注释驱动使用内部 AOP,我也不认为这是 OP 的重点或期望的结果。
  • 这不是无关紧要的,因为我解释过他可以在 XML 中全局执行此操作。知道你可以在这里和那里使用注释来定制它总比不知道要好,IMO。
【解决方案2】:

您只需要方法级别的 TX 建议:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
   <tx:attributes>
      <tx:method name="changed*" propagation="REQUIRES_NEW" rollback-for="Throwable"/>
   </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceMethods" expression="execution(* my.package.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>

【讨论】:

  • 这绝对是一个按名称过滤方法的选项,谢谢!但是我们可以在里面放更多的魔法吗 ;-) 是否可以在第一次调用 DAO 方法 in changed() 时开始事务并在 从返回时开始提交 changed()。如果这是可能的,我在类中命名新方法时不必小心。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2014-11-30
  • 2016-12-02
  • 2016-08-16
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
相关资源
最近更新 更多