当前位置: 首页 > 知识库问答 >
问题:

Proxied REQUIRES\u新方法不回滚(spring)

华恩
2023-03-14

我让spring将服务注入自身,以允许服务对自身进行事务性调用。不幸的是,我发现一个requires\u新方法抛出NullPointerException并被捕获,但它并没有回滚新事务。外部事务没有中断,这正是我想要的,但我很难解释为什么需要新事务没有回滚。有什么想法吗?

@Service(value="orderService")
@Transactional
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderService orderService; // transactional reference to this service

    public void requiredTransMethod(){
        try {
            orderService.requiresNewTransMethod();
        }catch(Throwable t){
            LOG.error("changes from requiresNewTransMethod call should be rolled back right?", t);
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void requiresNewTransMethod() {
        // database changes that are NOT rolled back
        throw new NullPointerException("bla bla bla");
    }

}

共有1个答案

法弘亮
2023-03-14

这可能是事务注释不起作用的实例,因为您从同一类中调用它们。

Spring的AOP实现的工作方式(默认情况下)是使用代理类,这对于同一类内的方法调用来说不会像预期的那样工作。

 类似资料:
  • 我创建了一个MySQL数据库,并填充了用于测试的行。我想在这个数据库上进行DAO单元测试。每个都是,因此每次测试后都会进行回滚。不幸的是,它无法工作,因为我的数据库仍在进行更改。 我正在用以下上下文加载Spring配置。xml 这个问题说我 必须在应用程序上下文中提供bean 但即使有了它(在我的上下文中是),什么都没有发生,我的数据库仍然被修改,没有回滚。 这是我的DAO测试课 在我的配置中,或

  • 问题是即使抛出了未检查的异常,methodC()也不会回滚。

  • 问题内容: 美好的一天。如下代码: 据我了解,如果方法中存在异常,则不会回滚事务。以及如何使它滚动?并返回SomeResult 问题答案: 您不应该以编程方式调用回滚。根据docs的建议,最好的方法是使用声明性方法。为此,您需要注释哪些异常将触发回滚。 在你的情况下,像这样 看一下@Transaction API 和有关回滚事务的文档。 如果尽管有文档建议,但仍要进行程序化回滚,则需要按照已建议的

  • 我的项目遇到了Spring JPA事务无法回滚的问题。项目框架为spring MVC+spring+spring data JPA+Oracle。我在网上搜索了很多信息,但仍然不能解决我的问题。 我尝试了许多方法,例如将方法设置为public或在中添加,但仍然无法解决这个问题。 这是我的代码 控制器 服务 刀 我的方法加载我的实现类服务,它编写一个容易出错的1/0。我期望事务在出错后回滚,但它没有

  • 我使用的是Spring Boot应用程序,在上面我试图实现事务性管理。但是Spring不会回滚用相同方法保存的数据。 代码库:https://github.com/vinothr/spring-boot-transactional-example