- 问题描述
在配置多数据源项目中, service中根据@DS("**")配置实现数据库切换. 在加@Transactional事务的方法中, 调用另外一个数据源不用service的方法, 此方法会因为切换数据库失败导致执行sql错误. 示例如下
@DS("master")
public class TestMasterServiceImpl impl TestMasterService {
@Transactional(rollbackFor = Exception.class)
public Integer save() {
subSave();
testSlaveService.save();
return null;
}
private Integer subSave() {
}
}
@DS("slave")
public class TestSlaveServiceImpl impl TestSlaveService {
@Override
public Integer save() {
}
}
- 问题分析
开启事务的同时,会从数据库连接池获取数据库连接, 在这个事务内的所有数据库操作都基于这个连接. 为使@DS生效, 必须重新获取数据库连接, 可以采取更改事务传播机制的方法实现. - 问题解决
将代码修改如下, 两个方法设置事务传播机制为「propagation = Propagation.REQUIRES_NEW」
@DS("master")
public class TestMasterServiceImpl impl TestMasterService {
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public Integer save() {
subSave();
testSlaveService.save();
return null;
}
private Integer subSave() {
}
}
@DS("slave")
public class TestSlaveServiceImpl impl TestSlaveService {
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public Integer save() {
}
}