普通Spring + Hibernate事务行为?

时间:2013-02-13 02:17:47

标签: hibernate transactions aop spring-transactions

我已经将Spring + Hibernate项目配置为使用Spring AOP进行事务处理

当我用TransactionSynchronizationManager.isActualTransactionActive()检查DAO方法时,它表示正确。

我正在从我的服务类调用两个DAO方法,在第二个DAO方法中,我有意'devide by zero'抛出一个错误,看看这两个方法是否回滚。

目前第一个似乎插入一个新的记录就好了。不应该第一种方法回滚?

更新的 你可以参考我之前的问题,但我认为这可能太长了 Transaction Management in Spring 3.x and Hibernate 4


总结一下这个问题(尽我所能),
我有一个服务类方法从DAO类调用两个方法 该服务类是从spring mvc控制器及其委托人调用的。

我得到了我的aop:config如下

<aop:config proxy-target-class="true">
  <aop:pointcut id="transactionalServiceOperation" expression="execution(* kr.co.sgis.services.web.cooingbee.Crudable.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionalServiceOperation"/>
</aop:config>


我的界面Crudable看起来像这样

public interface Crudable {

    public int delete(CooingbeeFetchable bean);
    public int save(CooingbeeFetchable bean);
    public int update(CooingbeeFetchable bean);
    public Set<CooingbeeFetchable> list(CooingbeeFetchable bean);
    public CooingbeeFetchable get(int id);
    public int count(CooingbeeFetchable bean);
    public int save2(CooingbeeFetchable bean);
}


两者 DAO和Service类都实现了Cruadable接口。现在我想也许就是这样 是因为它没有像我预期的那样工作? 希望我给你足够的信息,而不是太冗长:)

2 个答案:

答案 0 :(得分:0)

如果两种方法都是事务性的,那么第二种方法的失败自然不会影响第一种方法。如果您认为这两种方法都是单个(正确)事务的一部分,那么您就会错误地认为它或者它似乎部分提交的事实。你需要提供更多的信息才能得到一个好的答案,为什么其中一个是真的。

答案 1 :(得分:0)

我终于弄清楚了。
读这个。
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back

该文档说你需要为Spring抛出异常,才能知道出错了 使用DAO方法,以便它可以回滚。以前我的DAO方法没有抛出任何异常,而是通过围绕a中的方法体自行处理异常 try-catch block。

另外,你需要像这样配置你的aop:config标签。

<aop:config proxy-target-class="true">
  <aop:pointcut id="transactionalServiceOperation" expression="execution(* kr.co.sgis.services.web.cooingbee.Crudable.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionalServiceOperation"/>
</aop:config>

我希望这有帮助! :)。
欢呼声