小编典典

为什么即使在Spring服务类的第二种方法中,即使propagation = Propagation.REQUIRES_NEW,事务也会回滚?

hibernate

现在基本设置都很好,我开始尝试事务。Struts + Spring + Hibernate注释事务管理器。这是Action中的示例代码,将调用服务类:

    userService.addUser();

这是addUser()服务类中的方法:

    @Transactional(value="deu"  )
    public void addUser() {     
        userDao.addUser();
        this.addUser2();

    }

首先,我调用addUser了userDao,它将插入一个用户。其次,我addUser2在该服务类中调用了另一个方法。

    @Transactional(value="deu" , propagation=Propagation.REQUIRES_NEW  )
    public void addUser2()   {      
    //should be a new transaction and will not affect the previous one. 
            //this one will fail but should not affect the previous one.
        userDao.addUserFail();        
    }

由于PK为空,因此此操作将失败。我想第二个呼叫(addUser2)将失败,但不会影响前一个。但是,未插入用户。

如果我仅致电:

   @Transactional(value="deu"  )
    public void addUser() {     
        userDao.addUser();
        //this.addUser2();      
    }

它正在工作,这意味着数据库等基本设置没有错。

任何的想法?


阅读 335

收藏
2020-06-20

共1个答案

小编典典

Spring的声明式事务处理使用AOP代理进行工作。当您获得事务性bean时,实际上您会获得一个代理,该代理包装您的bean实例,拦截方法调用,必要时启动事务,然后调用实际bean的方法,然后在必要时提交或回滚事务。

但是您是从同一个bean内的另一个方法调用bean的方法,因此代理被绕过,并且无法应用任何事务行为。

将方法放在另一个bean中,或使用AspectJ,后者检测字节码并可以拦截bean内部方法调用。

有关更详细的说明,请参见Spring文档

2020-06-20