2026/09/07笔记

事务的使用:

一、@Transactional 注解:

AOP代码实现的:在调用this.syncLocal(incoming))方法的前后,开启和提交事务。

调用方

→ Spring 代理对象.method()

→ 拦截器:开启事务

→ 真正执行目标方法

→ 拦截器:提交 / 回滚

二、transactionTemplate (精细化给某段代码加事务控制)

TransactionTemplate 是编程式开启,不依赖代理,私有方法里也能用。

  1. TransactionManager.getTransaction() // 开启事务、绑定到当前线程

  2. 执行 syncLocal(...) // 里面的 JDBC/MyBatis 自动加入这个事务

  3. commit(成功)或 rollback(异常)

@Override

public void fullSync() {

SingleCellDataPermissionHelper.ignore(() -> {

List<CellSingleLimsTrialGroup> incoming = loadFromLims();

if (CollectionUtils.isEmpty(incoming)) {

throw new ServiceException("LIMS部门数据为空,终止同步");

}

transactionTemplate.executeWithoutResult(status -> syncLocal(incoming));

cellSingleLimsTrialGroupTreeCache.refresh();

});

}

//不能使用@Transactional注解会失效

private void syncLocal(List<CellSingleLimsTrialGroup> incoming) {

Map<Long, CellSingleLimsTrialGroup> incomingMap = toIdMap(incoming);

Map<Long, CellSingleLimsTrialGroup> existingMap = toIdMap(cellSingleLimsTrialGroupDao.selectAllKeys());

List<CellSingleLimsTrialGroup> toInsert = new ArrayList<>();

List<CellSingleLimsTrialGroup> toUpdate = new ArrayList<>();

List<Long> toDelete = new ArrayList<>();

for (Map.Entry<Long, CellSingleLimsTrialGroup> entry : incomingMap.entrySet()) {

if (existingMap.containsKey(entry.getKey())) {

toUpdate.add(entry.getValue());

} else {

toInsert.add(entry.getValue());

}

}

for (Map.Entry<Long, CellSingleLimsTrialGroup> entry : existingMap.entrySet()) {

if (!incomingMap.containsKey(entry.getKey())) {

toDelete.add(entry.getKey());

}

}

if (CollectionUtils.isNotEmpty(toDelete)) {

cellSingleLimsTrialGroupDao.deleteByIds(toDelete);

}

if (CollectionUtils.isNotEmpty(toUpdate)) {

cellSingleLimsTrialGroupDao.updateByIds(toUpdate);

}

if (CollectionUtils.isNotEmpty(toInsert)) {

cellSingleLimsTrialGroupDao.insertBatch(toInsert);

}

log.info("检测部门树全量同步完成, incoming={}, insert={}, update={}, delete={}",

incomingMap.size(), toInsert.size(), toUpdate.size(), toDelete.size());

}

相关推荐
~patience~3 小时前
WAV 逆向分析工具使用笔记
笔记
滴啦嘟啦哒4 小时前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
xier_ran4 小时前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习
连山齐名4 小时前
ai应用开发的学习笔记
服务器·笔记·学习
乔旭伟4 小时前
中小厂生产管理系统选型笔记:驱动方式、主线链路与成本结构
笔记·需求分析·规格说明书
xier_ran4 小时前
【infra之路】AI 编译器学习笔记(十四):为什么要 tiling,以及矩阵计算单元的“固定“
人工智能·笔记·学习
如旧呀5 小时前
origin绘制等距的HSD置信区间
笔记·origin
问心无愧05135 小时前
[极客大挑战 2019]Upload
笔记
蒸蒸yyyyzwd6 小时前
CMU 11-768 p1-3 笔记
笔记
Generalzy6 小时前
Qt 桌面开发入门:PySide6 学习路线、架构原理与技术选型
笔记·python·学习