2014-04-04 46 views
1
@Override 
    @Transactional(rollbackFor = { RuntimeException.class, Exception.class}, propagation = Propagation.REQUIRED) 
    public String upload(ObjectVO vo) throws CustomException { 
    ....... 
    } 

在此服务中,我插入到两个表中。如果在处理数据(例如强制性字段检查)时出现异常,而第二个表应该在第一个表之后插入,那么它是否应该在相同事务中回滚插入第一个表中的数据?在我的情况下,我没有得到它回滚。预期的行为是什么? (是的,我不捕捉异常,其包含在rollbackFor第一个自定义异常,并且被抛出)
I am using hibernate) DAO层做getSession().save(entity);getSession()返回currentSession)@transaction - 回滚失败

(所以第一张表中的数据仍然存在)

表格不相关。

<tx:annotation-driven/> 

<bean id="transactionManager" 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
     lazy-init="true"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
+0

确定服务实例由Spring管理? – Mani

+0

是的,我相信 –

+1

我假设你的customException是checkedException。如果它是CustomException,如果你没有明确捕获它应该是方法签名的一部分(作为抛出) - 我错了任何地方? – Mani

回答

1

你确定代理实际上应用于方法调用吗?

假设您使用经典动态代理(而不是aspectJ),您可以确保该方法是从其类之外调用的吗?

[编辑] 如果您在使用Hibernate事务管理程序切换到HibernateTransactionManager

+0

我没有找到你。“方法从类外部调用”部分 –

+0

哪种方法实际上调用带注释的方法?它位于的位置 – Gab

+0

它从控制器调用 –

0

我记得我也有这样的问题。我的问题与正确的配置有关。 例如:您是否在TransactionManager声明中指定了如下内容:

transactionManager.setRollbackOnCommitFailure(true);

您也可以使用调试器并在TransactionManager的实现中捕获执行。你在那里有一个像回滚的方法,你会看到什么是这个操作ommited的原因。

+0

我看不到一个地方,我需要指定transactionManager.setRollbackOnCommitFailure(true); nt它默认为真? –

+0

我正在使用提供程序:JpaTransactionManager和该方法在AbstractPlatformTransactionManager中指定。如果你正在使用别的东西。只需使用调试器并检查是否没有额外的回滚条件。 –

+0

am使用休眠 –

1

第一: 作为建议,先加入使日志中你的log4j以下

log4j.category.org.springframework=ALL 

其次: 如果您从同一个Servcie类中的另一个方法(如xxxMethod)调用upload方法,并且xxxMethod未由Transaction记录。那么不会有任何回滚。 ,因为代理中方法与方法之间的调用不是由Spring上下文处理的。因此它不能包装交易。

如果第二个无效,请启用日志验证日志。你的日志应该显示事务何时开始,什么时候结束,哪些方法被添加到事务上下文中。

像下面

DEBUG org.springframework.transaction.annotation.AnnotationTransactionAttributeSource - Adding transactional method 'saveDomain' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' 


2014-04-04 10:25:24,276 [main] TRACE org.springframework.orm.jpa.JpaTransactionManager - Triggering beforeCompletion synchronization 
2014-04-04 10:25:24,276 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Initiating transaction rollback 

所以

注意**,如果DAO层还标注了交易,并与传播规律为Propagation.REQUIRES_NEW - 的道法视为个人UOW。所以从服务层抛出异常不会回滚以前的事务。

一般 - 它会建议保持在交易一层,最好用Service - Layer

+0

thnx为春天上下文的宝贵信息。但问题出在交易经理身上。修复 –