记录工作时的一个大坑
之前遇到一个问题 排查了很久
有一个同事在service上加了一个@Transaction注解 然后在druid配置的多数据源。
在单个service中使用就没有问题,会自动转换数据源。
但是问题来了 在一个加了@Transaction的方法中 导致调用其他不同库的service 数据源切换失效。
列如:
@Transaction
@Service
public class ServiceA{
//ServiceA,B,C 对应3个不同的数据源,单独调用方法没有问题
@Autowire
private ServiceB b;
@Autowire
private ServiceC c;
public void a(){
b.b();
c.c();
}
}
如果使用serviceA 中的a方法 会导致一直使用serviceA的数据源@DS(“a”)
原因是@Transaction是开启了一个事务,spring中事务的传播行为默认为
Propagation.REQUIRED:如果当前有事务,则加入该事务,如果当前没有事务,则创建新的事务。
所以后续的b c 方法都是加入到数据源@DS(“a”)中的事务中。
所以会导致切换数据源失效
解决方法1:
删除@Transaction注解
解决方法2:
改为@Transactional(propagation = Propagation.REQUIRES_NEW)
每次都新创建一个事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void a(){
b.b();
c.c();
}