当前位置: 首页 > 面试题库 >

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

宰父俊彦
2023-03-14
问题内容

现在基本设置都很好,我开始尝试事务。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();      
    }

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

任何的想法?


问题答案:

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

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

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

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



 类似资料:
  • 我正在用JPA和Hibernate做一些简单的测试,当我不希望的时候,我碰巧关闭了EntityManager。 这是我的测试主: DB助手: 实体和对应的DAO: 在商店里,当开始交易时,我得到以下信息: 未执行关机方法。为什么实体管理器关闭? 为了完整起见,以下是persistence.xml:

  • 在上面的代码中,ConstraintViolationException发生在saveTicket()方法内,saveTicket()内的dao甚至在捕获异常之前就已经回滚了它的事务(这是我所知道的),第一个没有回滚,因为它在另一个事务中。(这是我已经知道的行为)。 当我使用另一个事务性方法调用这两个预览方法(updateRequest()和saveTicket()),当saveTicket()方

  • 在上面的代码中,我将hibernate与mysql一起使用,hibernate会话由SpringSessionContext管理(在事务边界下使用SessionFactory.CurrentSession类) 下面的镜像(dao层)是直接的用例,但是异常没有回滚,我从简单的服务层调用这个方法(即服务层调用dao层进行CRUD操作),我了解了spring在事务管理上的代理机制,在这种情况下,下面的镜

  • 这是我的代码: 因为我使用POM设计模式,所以我为此创建了一种方法: 这是超文本标记语言标签: 我的问题是,即使存在WebElement,isDisplayed()也返回false。

  • 我在一家spring boot hibernate JPA个人项目书店工作。我面临一个问题,即使用@Transactional注释注释的方法即使在运行时异常的情况下也无法回滚事务。我使用的是spring boot版本1.5.1、hibernate版本5、java版本11 下面是bean配置文件代码: 下面是BooK模型文件代码 下面是商店型号代码 下面是BookDaoImpl代码 下面是Store

  • 问题内容: 我有一个带有SQL插入SQL Server 2005数据库的.net事务。该表具有一个身份主键。 当事务内发生错误时,将被调用。行插入将正确回滚,但是,下次我将数据插入表时,标识将增加,就好像从未发生过回滚一样。因此,本质上在同一性序列中存在缺口。有什么方法可以让该方法回收丢失的身份? 我不是用正确的方法吗? 问题答案: 如果您考虑一下,则自动递增号 不应 是事务性的。如果其他事务必须