Spring @Transactional rollback不工作

时间:2014-04-09 08:59:30

标签: spring transactions commit rollback transactional

我有一个如下代码

   public abstract class AffltTransactionService implements IAffltTransactionService {
    ....

        @Override
        @Transactional
        public void processTransactions(List<? extends AffltTransaction> transactions) {
            for (AffltTransaction transaction : transactions) {
                if (transaction != null) {
                    processTransaction(transaction);
                }
            }
        }

        private void processTransaction(AffltTransaction transaction) {
            try {
                processTransactionInternal(transaction);

            } catch (Exception exception) {
                affltTransactionError = new AffltTransactionError(null, null, "error", new Date());
                saveAffltTransactionError(affltTransactionError);
                log.error(exception.getLocalizedMessage());
            }
        }

        @Transactional(readOnly=false, rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
        public void processTransactionInternal(AffltTransaction transaction) {

processTransactionInternal抛出ServiceUnAvailableException,它扩展了RuntimeException

但是,尽管有rollbackFor = Exception.class,但事务并没有回滚。 你能帮忙吗?

4 个答案:

答案 0 :(得分:6)

如果直接调用该方法,

@Transactional注释将不会产生任何影响,因为Spring在注释类上方创建代理,而方面定义的功能由代理实现。因此,当您从类中调用该方法时,它无法通过代理,因此不会创建和/或回滚转换。

请查看Spring reference以获取详细说明。

答案 1 :(得分:2)

由于您在同一个bean中调用另一个方法,因此Spring AOP在这种情况下不使用任何建议。

processTransactions仅包含TransactionInteceptor

要使其有效,您应该配置:

<aop:aspectj-autoproxy expose-proxy="true"/>

但它并没有被推荐。

此处有更多信息:http://www.intertech.com/Blog/secrets-of-the-spring-aop-proxy

答案 2 :(得分:1)

使用getCurrentSession而不是opensession

答案 3 :(得分:0)

您使用的方法@Transactional应该抛出异常。不要使用try-catch。(我猜你在processTransaction函数的某个地方使用了try-catch)。 代码应该是这样的:

@Transactional
    public void processTransactions(List<? extends AffltTransaction> transactions) threws Exception{
        for (AffltTransaction transaction : transactions) {
            if (transaction != null) {
                processTransaction(transaction);
            }
        }
    }