transactions - Quarkus @Transactional 是否需要像 spring AOP 这样的公共方法
问题描述
在 spring 的上下文中,我们总是需要确保一个方法@Transactional
是公共的,并且是从服务类的外部调用的。其背后的原因在stackoverflow或spring guides中多次记录。
Quarkus似乎也有同样的情况。让我们看下面的例子:
@Path("/testing")
public final class TestingResource {
@Inject
JustATestService justATestService;
@GET
@Path("testa")
public Response testA() {
justATestService.doWithPublicTransaction();
return Response.ok().build();
}
@GET
@Path("testb")
public Response testB() {
justATestService.doWithPrivateTransaction();
return Response.ok().build();
}
}
这是服务类:
@ApplicationScoped
public class JustATestService {
@Inject
TransactionManager tm;
@Transactional
public void doSomethingInTransaction() throws SystemException {
System.out.println("Active transaction: " + tm.getStatus());
}
public void doWithPrivateTransaction() throws SystemException {
System.out.println("Not in a transaction: " + tm.getStatus());
doSomethingInAPrivateMethode();
System.out.println("Still not in a transaction: " + tm.getStatus());
}
@Transactional
private void doSomethingInAPrivateMethode() throws SystemException {
System.out.println("Private method will not start a transaction: " + tm.getStatus());
}
}
结果将是:
testing/testa
将在控制台中显示 Status.STATUS_ACTIVE (=0)testing/testa
将始终在控制台中显示 Status.STATUS_NO_TRANSACTION (=6)
我的假设对吗?我们是否需要确保@Transactional
需要从服务外部调用带注释的方法才能工作?Quarkus 在这种情况下会表现得“像”春天吗?
解决方案
没错,同样的规则也适用于 Quarkus:@Transactional 触发的 CDI 拦截器无法处理自调用。
阅读本期的讨论:
在您的测试中,您在同一类上的其他方法调用的方法上有@transactional。CDI 拦截器不适用于自调用,仅适用于外部调用(例如,当您注入 bean 并在其上调用时)。
推荐阅读
- php - 如何比较从数据库中获取的数据并获得该特定行的最大值
- javascript - 我的本地存储对象不断被替换而不是更新
- jenkins - Jenkins 管道配置页面上没有保存/应用按钮
- sql - 如何通过使用 sum(column) 设置空列进行分组?
- php - 使用会话变量时出现未定义的索引错误
- arrays - 将 [MLMultiArray] 转换为浮点数?
- c - 为什么 malloc 会触发断点?
- javascript - 角度 ctx.cart.getQuantity 不是函数
- julia - 令人费解:println 打印,然后在 Atom 中删除参数>1e8 的行
- c++ - 带有兄弟文件夹的 CMake 目标