一个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

相关推荐
集成显卡7 小时前
Rust实战七 |基于带 colored 颜色文字控制台的批量文件删除工具
开发语言·后端·rust
刀法如飞7 小时前
AI时代:DDD领域驱动建模与Ontology语义建模的区别
java·设计模式·架构
jeffer_liu7 小时前
Spring AI 生产级实战:工具调用
java·人工智能·后端·spring·ai编程
比昨天多敲两行7 小时前
linux 线程概念与控制
java·开发语言·jvm
huaweichenai8 小时前
php 根据每个类型的抽签范围实现抽签功能
开发语言·php
8Qi88 小时前
LeetCode 75:颜色分类(荷兰国旗问题)—— Java 题解 ✅
java·算法·leetcode·指针·排序
zzhongcy8 小时前
@Transactional 同类内部调用失效 + 两种自代理解决方案
java
AutumnWind04208 小时前
【Intelij IDEA使用手册】
java·ide·intellij-idea
codeejun9 小时前
每日一Go-73、云原生成本优化 —— 资源限制 & 指标驱动扩容
开发语言·云原生·golang
就叫_这个吧9 小时前
Java注解、元注解、自定义注解定义及应用
java·开发语言·注解