为什么Spring在TransactionSynchronization接口中没有回滚方法?

时间:2015-02-27 03:24:54

标签: java spring spring-transactions

在Spring TransactionSynchronization接口中,它有方法(按执行顺序):

- beforeCommit
- beforeCompletion
- afterCommit: Can perform further operations right after the main transaction has successfully committed. 
- afterCompletion

为什么Spring没有回滚方法,例如beforeRollback或afterRollback,但它只用于提交(beforeCommit和afterCommit)?这有必要吗?有人可以给我一些建议或解释一下吗?

如果我想继续进行主要交易成功回滚的进一步操作,例如通知消息或电子邮件,我应该在这种情况下做什么?

2 个答案:

答案 0 :(得分:0)

                    @Override
                    public void afterCompletion(int status) {
                        if (status == TransactionSynchronization.STATUS_ROLLED_BACK) {
                            logger.trace("Rolled back...");
                        }
                    }

答案 1 :(得分:-1)

我可以问你为什么使用这个界面?

这用于负责管理事务生命周期的PlatformTransactionManager的回调。

Spring Transactions的“正常”使用是以编程方式利用@Transactional注释,xml或TransactionTemplate / PlatformTransactionManager中的aop声明来设置事务范围,行为和可见性,如文档中所述 - {{3} }。

要管理回滚等的事务行为,您只需告诉spring在发生异常时该怎么做

public class Foo { 

   @Autowired public Service someService;

    @Transactional(propagation = Propagation.REQUIRES_NEW,
                   noRollbackFor = {IOException.class})
    public boolean bar(SomeObject someObject) throws IOException {
         someService.doComplicatedThing(someObject.getValue());
    }
}

这告诉PlatformTransactionManager在命中foo()方法时启动新TX,成功返回或IOException时提交,如果存在其他类型的异常则返回。这是它的天才 - 您不必担心使用getTransaction().isActive()乱丢您的代码以及用于管理隔离的复杂检查。