繁体   English   中英

通过反射调用@Transactional 方法时未创建 Spring 事务

[英]Spring transaction not being created when invoking @Transactional method via reflection

我有一个类通过反射调用另一个类上的公共方法。 调用类已经有一个活动事务,被调用类上的公共方法标记为

@Transactional(propagation = Propagation.REQUIRES_NEW)
    public void handleProcess() { ..}

调用看起来像

Runnable runnable = null;
Method handleMethod = config.handleProcessMethod;
            Object handler = autowireHandler(process);
            runnable = () -> {
                LOGGER.info("executing method {} on {}",handleMethod,handler);
                handleMethod.invoke(handler);
            };
runnable.run();

该方法被正确调用,但日志表明它正在参与当前事务而不是创建新事务。

08:54:33.452 [process-executor-2] DEBUG o.springframework.orm.jpa.JpaTransactionManager - Found thread-bound EntityManager ... for JPA transaction
08:54:33.453 [process-executor-2] DEBUG o.springframework.orm.jpa.JpaTransactionManager - Participating in existing transaction

编辑:实际上,上面的日志是调用的方法中创建的,由 JPA 存储库引起,而不是在它之前。 所以看起来@Transactional 注释根本没有被处理。

反射是否导致 spring 错过了 @Transactional 注释? 我需要被调用的方法来使用它自己的事务,以便在从调用返回之前提交它。

注释告诉 Spring 用实现事务行为的代理包装什么。 反射绕过该代理并直接调用包装的方法。 查看日志应该可以确认,您可能需要为 spring 设置日志级别。

不要为此使用反射,因为这是在 Spring 的背后,它无法帮助您。 您可以自动装配实现公共接口的服务列表。 您的代码可以遍历列表并找出哪个与您需要执行的操作相关,然后在所选服务上调用该方法。

如果您将任务提交给执行程序,当在工作线程上找不到实体管理器时,您将遇到麻烦。 如果您让这些服务改用 Spring 异步方法,那么 Spring 将处理事务、entityManager 等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM