Spring @Transactional如何将不同的方法附加到同一个事务中

时间:2011-08-05 09:46:18

标签: spring transactional

我遇到了事务配置子类化的问题。

我有一个有这种方法的A类:

@Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<ModificaOperativitaRapporto> eventMessage) {
// some dao operations
        return eventMessage;
    }

然后B类继承A类并重写激活方法

 InserimentoCanaleActivator extends ModificaOperativitaRapportoActivator ....

    @Override
        @Transactional(propagation = Propagation.REQUIRES_NEW)
        public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<ModificaOperativitaRapporto> eventMessage) {
// others dao operations 
    return super.activate(eventMessage);

我需要在单独执行super方法时有自己的事务,但是当执行B类方法时,所有操作都需要参与同一事务。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

事务将整个方法调用包装在bean中,但是它应用于bean的级别而不是该方法的各个类实现的级别。 基本上,Spring使用AOP处理事务。它的作用是将代理对象作为bean本身。代理管理事务的启动,在实现类中运行方法,然后在返回的路上完成事务(提交或回滚)。这是一种优雅的方式,比任何手动方法都简单得多(考虑到Java的限制)。

代理机制一旦应用(通过@Transactional注释加上一些其他配置),就会查看要执行的事务处理类型(注释的propagation参数)和选择正确的行动。在您的情况下,如果您希望超类具有@Transactional(propagation=REQUIRES_NEW)而子类具有@Transactional(propagation=REQUIRED),那么我希望它能够工作;超类的注释将被忽略,因为注释机制将首先看到子类的注释并停止查看。