首页 > 解决方案 > Quarkus @Transactional 是否需要像 spring AOP 这样的公共方法

问题描述

在 spring 的上下文中,我们总是需要确保一个方法@Transactional是公共的,并且是从服务类的外部调用的。其背后的原因在stackoverflowspring 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());
    }

}

结果将是:

我的假设对吗?我们是否需要确保@Transactional需要从服务外部调用带注释的方法才能工作?Quarkus 在这种情况下会表现得“像”春天吗?

标签: transactionsquarkus

解决方案


没错,同样的规则也适用于 Quarkus:@Transactional 触发的 CDI 拦截器无法处理自调用。

阅读本期的讨论

在您的测试中,您在同一类上的其他方法调用的方法上有@transactional。CDI 拦截器不适用于自调用,仅适用于外部调用(例如,当您注入 bean 并在其上调用时)。


推荐阅读