gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:39:59 24 4
gpt4 key购买 nike

现在基本设置都可以了,我开始尝试交易。Struts+Spring+Hibernate注解事务管理器。这是 Action 中的示例代码,将调用一个服务类:

    userService.addUser();

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

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

}

首先,我在 userDao 中调用了 addUser,这将插入一个用户。其次,我在该服务类的另一个方法中调用了 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 documentation .

关于java - 为什么即使在 spring 服务类的第二种方法中 propagation=Propagation.REQUIRES_NEW 时事务也会回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15313579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com