文章目录

  • 一、如何查看SpringBatch原数据和业务数据是一个事物
  • 二、多数据源如何引发SpringBatch多事物

写在前面: 我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 Java感兴趣,可以关注我,我们一起学习。

前言:我们项目在运行的时候出现了多事物问题,SpringBatch原数据表提交和业务表数据提交用的不是一个事物,这在项目运行中是一个非常致命的问题。在极端情况下断点续跑可能会出现丢失数据,所以解决这个问题迫在眉睫。

一、如何查看SpringBatch原数据和业务数据是一个事物

SpringBatch源代码TaskletStep这个类的doInTransaction这个方法时保存业务数据和SpringBatch源数据表。

  • 保存业务数据
    result = tasklet.execute(contribution, chunkContext);

  • 保存SpringBatch上下文表
    getJobRepository().updateExecutionContext(stepExecution);

  • 保存SpringBatch step表
    getJobRepository().update(stepExecution);

为了验证保存业务数据和保存SpringBatch源数据是使用一个事物提交,我们可以通过debug方式分别把断点打到这三行代码上。

result = tasklet.execute(contribution, chunkContext);
getJobRepository().updateExecutionContext(stepExecution);
getJobRepository().update(stepExecution);

查询SpringBatch业务表和源数据表断点走完业务表无数据、batch上下文表,batch_step_execution表都是最初是状态则说明是一个事物。

select * from batch_step_execution ORDER BY STEP_EXECUTION_ID desc;
select * from batch_step_execution_context order by STEP_EXECUTION_ID desc;
select * from cat;

batch_step_execution_context初始状态

159  {"batch.taskletType":"org.springframework.batch.core.step.item.ChunkOrientedTasklet","FlatFileItemReader.read.count":0,"batch.stepType":"org.springframework.batch.core.step.tasklet.TaskletStep"}

batch_step_execution初始状态

187  3   cafeCatStep 1015    2020-11-25 10:02:05 2020-11-25 10:03:03 STARTING 0  0   0   0   0   0   0   0   UNKNOWN 2020-11-25 10:03:03

SpringBatch源码TaskletStep类doInTransaction方法

public RepeatStatus doInTransaction(TransactionStatus status) {TransactionSynchronizationManager.registerSynchronization(this);RepeatStatus result = RepeatStatus.CONTINUABLE;//代码省略.......result = tasklet.execute(contribution, chunkContext);//代码省略...stepExecutionUpdated = true;getJobRepository().updateExecutionContext(stepExecution);getJobRepository().update(stepExecution);//代码省略...return result;}

二、多数据源如何引发SpringBatch多事物

项目中使用了多数据源,而且重写了BasicBatchConfigurer这个类的这个initialize方法。而且这个类中重新new了一个新的数据源,通过各种排查确定出原因是这个new的新数据源导致多事物问题。

详细代码如下:

总结:我们最好不去修改原生态的SpringBatch代码,否则会出现意想不到的结果。

致命问题多数据源引发SpringBatch多事物相关推荐

  1. SpringBoot--Druid多数据源配置

    SpringBootDruid多数据源Atomikos 多数据源 导入依赖 <!-- MySql驱动 --> <dependency> <groupId>mysql ...

  2. spring boot 三种类型事物实现说明

    首先需要了解的是spring boot 对事物的分类 1: JDBC 事物 引入依赖包 spring-boot-starter-jdbc jdbc事物是传统方式,直接连接数据库进行操作. 需要增加配置 ...

  3. SpringBoot分表分库配置多数据源

    1.背景的介绍 有时候我们需要做分库分表,那么肯定存在多数据源,Spring Boot和Mybatis的多数据源是如何整合的呢?比如说我们现在做了一个浪迹天涯管理的后台系统,商品信息是存在itemCe ...

  4. 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 )

    文章目录 一.Activity 启动源码分析 ( AMS | ActivityManagerService ) 1.Instrumentation 调用 AMS 方法 2.ActivityStarte ...

  5. Spring 2.x AOP 配置方式整理

    來源:http://www.javaeye.com/topic/320553 spring官方手册给出的配置实例. ------------------------------------------ ...

  6. system.exception所有子类详解

    一直以来写代码抛出的异常都用的exception,从来没有像书上教的那样具体可能是啥异常就抛对应的异常,最后才说用的exception异常类抛异常.前段时间整理代码的时候突然感觉好像从来也就没有对异常 ...

  7. Zhishi.me - Weaving Chinese Linking Open Data

    Zhishi.me - Weaving Chinese Linking Open Data 1. 困难 managing the heterogeneity of knowledge indiffer ...

  8. 物联网识别技术期末复习概要

    物联网识别技术期末复习概要 物联网识别技术 第一章 物联网的体系结构: 感知层:物联网的皮肤和五官,主要任务是识别物体,采集信息 网络层:物联网的精神中枢和大脑,负责信息传递和处理 应用层:物联网的社 ...

  9. 【Mybatis源码】源码分析

    [Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...

最新文章

  1. Gbps接口面向汽车应用
  2. 关于C/C++的trigraphs和Digraphs
  3. 网易云助力云音乐短视频功能快速上线
  4. 分布式系统关注点(14)——「弹性架构」详解
  5. Trumb/ARM 指令模式
  6. doc无法编译java文件_java编译成jar文件.doc
  7. 三次握手wireshark抓包分析,成功握手和失败握手
  8. linux内核之kfifo队列
  9. 0302借软件工程触IT
  10. 深度学习优化算法大全系列7:NAdam,算法选择,调参
  11. java飞机大战boss素材_java小游戏飞机大战 源代码以及素材
  12. 机器学习周刊第二期:深度学习上了Nature
  13. 介绍中国传统节日的网页html,中国传统节日大全表 中国16个传统节日介绍
  14. 10分钟白嫖我的常用的在线工具网站清单
  15. micropython STM32移植笔记(一)
  16. 区间dp入门——总结+习题+解析
  17. 20211104:Excel今天距某个日期后90天还剩多少天
  18. 如何将多个excel表格合并成一个_怎样在线就能将多个PDF文档合并成一个?
  19. H.264及编解码调试
  20. 极客时间--数据结构与算法之美

热门文章

  1. oracle恢复库覆盖原来的库,oracle如何恢复被覆盖的存储过程
  2. 帆软日期控件变灰_FineReport-JS脚本常见日期使用整理
  3. JVM实战与原理---类加载机制
  4. C++ 标准库类型 string
  5. PyQt5 笔记3 -- 信号与槽
  6. TensorFlow 笔记1--基本用法
  7. ICML论文录取难度逐年上升,New In ML为你特设“名师辅导班”
  8. 【机器学习】盘点Kaggle中常见的AutoML工具库及用法
  9. Github开源!适合初学者的机器学习和深度学习的资料合集
  10. 【时间序列】时序预测竞赛之异常检测算法综述