一个transitional中操作两个不同的数据源的service

问题

问题就是使用了transitional注解之后会让DS注解失效。

解决办法

业务逻辑主入口这里正常使用@Transactional注解。

java 复制代码
package org.springblade.wlw.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import org.springblade.wlw.pojo.entity.waterdata.WaterDevice;
import org.springblade.wlw.pojo.entity.waterdata.WaterDistanceDeviceEx;
import org.springblade.wlw.pojo.vo.WaterDistanceDevice;
import org.springblade.wlw.service.IWaterDeviceService;
import org.springblade.wlw.service.IWaterDistanceDeviceExService;
import org.springblade.wlw.service.IWaterDistanceDeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class WaterDistanceDeviceServiceImpl implements IWaterDistanceDeviceService {
	@Autowired
	private IWaterDeviceService waterDeviceService;
	@Autowired
	private IWaterDistanceDeviceExService waterDistanceDeviceExService;

	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void insertFullRecored(WaterDistanceDevice waterDistanceDevice) {
		WaterDevice waterDevice = WaterDevice.fromWaterDistanceDevice(waterDistanceDevice);
		WaterDistanceDeviceEx deviceEx = WaterDistanceDeviceEx.fromWaterDistanceDevice(waterDistanceDevice);
		if (waterDevice == null || deviceEx == null) {
			return;
		}
		waterDeviceService.insertFullRecored(waterDevice);
		waterDistanceDeviceExService.insertFullRecored(deviceEx);
	}
}

两个单独的service也要声明事务,不过要指定为Propagation.REQUIRED_NEW. 每个Service上面要通过@DS注解指定数据源(这是一个正常的操作). 个人的一个建议:DS注解要么全部声明在service类上面, 要么全部生命在mapper接口上面, 避免到处都是。 虽然DS可以声明在方法上面, 但是还是避免吧,最好就是一个service控制一张表,是对一个表的增删改查, 没有必要声明在方法上面。

java 复制代码
	@Override
	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void insertFullRecored(WaterDevice device) {
		this.waterDeviceMapper.insertFullRecord(device);
	}
java 复制代码
	@Override
	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void insertFullRecored(WaterDistanceDeviceEx deviceEx) {
		this.waterDistanceDeviceExMapper.insertFullRecord(deviceEx);
	}

参考

1\] https://blog.csdn.net/qq_16159433/article/details/120951554

相关推荐
豆豆的java之旅2 分钟前
软考中级软件设计师 数据结构详细知识点(含真题+练习题,可直接复习)
java·开发语言·数据结构
sthnyph4 分钟前
QT开发:事件循环与处理机制的概念和流程概括性总结
开发语言·qt
大尚来也34 分钟前
Java 反射:从“动态魔法”到生产实战的避坑指南
开发语言
无心水42 分钟前
Java时间处理封神篇:java.time全解析
java·开发语言·python·架构·localdate·java.time·java时间处理
wuyikeer1 小时前
Spring BOOT 启动参数
java·spring boot·后端
多看书少吃饭1 小时前
Vue + Java + Python 打造企业级 AI 知识库与任务分发系统(RAG架构全解析)
java·vue.js·笔记
m0_587958951 小时前
C++中的命令模式变体
开发语言·c++·算法
博傅1 小时前
Kubernetes (K8s) 入门到实战教程
java
~无忧花开~1 小时前
React生命周期全解析
开发语言·前端·javascript·react.js·前端框架·react
奋斗的老史1 小时前
Stream-流式操作
java·windows