[英]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.