@transaction导致切换数据源失效

记录工作时的一个大坑

之前遇到一个问题 排查了很久
有一个同事在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();
	}

你可能感兴趣的:(java,spring,开发语言)