0

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

当我检查 DAO 方法时,TransactionSynchronizationManager.isActualTransactionActive()它说是真的。

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

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

更新 您可以参考我之前的问题,但我认为这可能太长了。
Spring 3.x 和 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 接口。现在我想也许这就是它没有按我预期工作的原因?
希望我给了你足够的信息而不会太长:)

4

2 回答 2

0

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

于 2013-02-13T05:01:16.077 回答
0

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

该文档说您需要为 Spring 抛出异常以知道 DAO 方法有问题,以便它可以回滚。以前我的 DAO 方法没有抛出任何异常,而是通过在 try-catch 块中包围方法体来自行处理异常。

此外,您需要像这样配置您的 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>

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

于 2013-02-13T06:57:16.577 回答