Spring AOP Transaction Management和Hibernate:对数据库的不受欢迎的提交

时间:2011-10-28 14:54:16

标签: java hibernate spring transactions aop

是否可以为仅调用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
}

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

允许} 中所有方法的事务导致对数据库的一些不受欢迎的提交。例如。当调用foo()时,在执行BusinessLayerFacade 时抛出Exceptionchanged(DomainObject myObject)已被提交到数据库,而不是在事务回滚时恢复更改。

有什么想法吗?

可以选择按名称过滤方法但是我们可以在那里放一些魔法;-)是否可以在第一次调用DAO方法时启动交易 myObject并开始提交 changed()返回。如果可以的话,我在课堂上命名新方法时不必小心。

谢谢,Stefan

2 个答案:

答案 0 :(得分:1)

如果抛出运行时异常,则回滚事务。如果抛出应用程序异常,则不会。您可以通过应用注释@Transactional:

来自定义它
@Transactional(rollbackFor=SomeException.class, noRollbackFor=SomeOtherException.class)

这也可以使用rollback-for元素的no-rollback-fortx:method属性在XML中进行全局自定义。

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

答案 1 :(得分:1)

您只需要方法级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>