0
点赞
收藏
分享

微信扫一扫

多数据源项目使用@DS切换数据库在事务中失效问题

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

相关推荐

0 条评论