javascript
致命问题多数据源引发SpringBatch多事物
文章目錄
- 一、如何查看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:03SpringBatch源碼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多事物的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一篇文章教你读懂Spring @Cond
- 下一篇: Java中如何将List拆分为多个小li