考虑我有以下四季豆

CompositeService:

@Service
public class CompositeService {

    @Resource
    private ServiceA serviceA;

    @Resource
    private ServiceB serviceB;

    public ResultBean compositeMethod() {
        ResultBean result = new ResultBean();
        result.setA(serviceA.getA());
        result.setB(serviceB.getB());
        return result;
    }

}


服务A:

@Service
public class ServiceA {

    @Transactional
    @Cacheable
    A getA() {
        // calls DAO layer and makes a query to the database
    }

}


服务B:

@Service
public class ServiceB {

    @Transactional
    @Cacheable
    B getB() {
        // calls DAO layer and makes a query to the database
    }

}


可缓存方面具有较高的顺序

此代码的问题在于,如果两个服务都发生高速缓存丢失,它将启动两个事务(并从池中建立两个连接)。
我可以在这种用例中将Spring配置为使用同一事务吗?
即将事务从ServiceA传播到CompositeService,然后再向下传播到ServiceB?

我无法将CompositeService设置为事务性的,因为在ServiceA和ServiceB中都发生缓存命中的情况下,我不想启动事务(并从池中借用连接)

最佳答案

如果一切都在同一个事务下,Spring只会传播一个事务。因此,简短的答案是您应该用CompositeService注释@Transactional

@Service
public class CompositeService {

    @Transactional
    public ResultBean compositeMethod() {
        ResultBean result = new ResultBean();
        result.setA(serviceA.getA());
        result.setB(serviceB.getB());
        return result;
    }
}


通常,这足够快,因为它仅从基础连接池中进行签出。但是,如果遇到延迟或不总是需要连接,则可以将实际的DataSource包装在LazyConnectionDataSourceProxy中。第一次需要时,这将获得一个Connection

09-27 14:56