考虑我有以下四季豆
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
。