Spring Batch事务处理

Spring Batch事务处理之前一直对SpringBatch的使用有些迷糊,尤其是事务这块,经常出些莫名其妙的问题,仔细了解了一下,做个小总结

大家好,又见面了,我是你们的朋友全栈君。

事务模型描述

1、step之间事务独立

2、step划分成多个chunk执行,chunk事务彼此独立,互不影响;chunk开始开启一个事务,正常结束提交
Spring Batch事务处理    
Spring Batch事务处理
图-job
总体事务

Spring Batch事务处理

Spring Batch事务处理 图-step内部事务


3、chunk定义:默认设置commitInterval=N,即读取N条数据为一个chunk(采用默认SimpleCompletionPolicy),或者reader里面所读取的item==null,或者
满足自定义完成策略
  
    

事务提交&回滚

1、事务提交条件:chunk执行正常,未抛RuntimeExecption
2、默认情况下,Reader、Processor、Writer抛出未捕获RuntimeException,当前chunk事务回滚,step失败,job失败

3、通过以下配置,保证出现异常时,事务不回滚,事务继续提交:
   
   
   
<batch:tasklet>
<batch:chunk />
<batch:no-rollback-exception-classes>
<batch:include class="com.xx.batch.DefRuntimeException"/>
</batch:no-rollback-exception-classes>
</batch:tasklet>

4、事务配置.通过以下配置,改变事务行为
    
    
    
<batch:tasklet>
<batch:transaction-attributes isolation="READ_COMMITTED" propagation="REQUIRES_NEW" timeout="300"/>
<batch:chunk reader="defItemReader" processor="defItemProcessor" writer="defItemWriter" commit-interval="10"/>
</batch:tasklet>

默认配置:
DEFAULT+REQUIRED



参数配置影响

1、
任务恢复
    

    
    
    
<batch:job id="jobId" restartable="true">
</batch:job>

     通过配置job的restartable=true,保证任务失败后能够进行恢复。比如:文件处理时,chunkSize=10,在line=35时处理失败,文件修复后,job将从31行开始重新处理(因为1-10,11-20,21-30进行事务提交,Spring Batch将ExecutionContext中的count持久化到系统表,恢复时读取)
    FlatFileItemReader继承
AbstractItemCountingItemStreamItemReader类,所以
默认具备读取恢复能力
    
2、跳过

    
   
   
   
<batch:chunk skip-limit="20">
<batch:skippable-exception-classes>
<batch:include class="com.xx.batch.ExceptionClass" />
</batch:skippable-exception-classes>
</batch:chunk>

或者
    
    
    
<batch:chunk skip-policy="defSkipPolicy">
</batch:chunk>

跳过数据量或者跳过策略不满足时候,step失败,job失败 

a、ItemProcessor处理中跳过

    事务回滚,失败条目在缓存标志为跳过,并重新开启一个事务处理缓存中的条目,并提交。这个时候会重复process,
如果存在业务逻辑,注意幂等性问题


b、ItemWriter处理中跳过

    事务回滚,失败条目在缓存标志为跳过,因为是批量提交,需要找出问题条目,所以针对每个条目开启一个事务循环处理process&write并提交,如果存在业务逻辑,注意幂等性问题


3、重试
    
    
    
<batch:chunk retry-limit="20">
<batch:retryable-exception-classes>
<batch:include class="com.xx.batch.ExceptionClass" />
</batch:retryable-exception-classes>
</batch:chunk>

或者

    
    
    
<batch:chunk retry-policy="defRetryPolicy">
</batch:chunk>

重试次数达到或者重试策略不满足时,step失败,job失败



4、reader-transactional-queue&processor-transactional

a、reader-transactional-queue,默认false,设置为true代表read资源具备事务特性,chunk事务回滚时,资源回滚。出现异常导致重复读取并处理,注意幂等性问题

b、processor-transactional,默认true,即writer失败时,processor重复执行,需要注意幂等性问题;设置false,即writer失败时,processor不再执行


处理组件事务


Spring  Batch提供了很多监听器等组件,在处理事务相关的问题时,参考下图进行事务考虑:
Spring Batch事务处理   
 
Spring Batch事务处理
图-job执行阶段轨迹&事务


    
注意:ItemReadeListener、ItemProcessListener、ItemWriteListener所有监听方法均在chunk事务当中执行,所以,如果在这些监听方法里面要处理好业务事务与chunk事务的关系,最好将业务事务设置为独立REQUIRE_NEW特性,
避免相互影响
    关于onXXError监听方法:改监听方法在事务回滚之前执行,或者事务提交之前执行(如果有no-rollback-exception配置)



一点点建议

    在使用Spring Batch的时候需要注意它要解决的问题域,它本身的关注点应该是提供一个批量处理的能力,即对文件或数据库的批量读取、写入和协议数据的转换,以及对整个过程的控制。
    
因此,如果在批量处理过程中需要做些业务逻辑,那么业务逻辑的实现需要与它彼此独立,尽量不要在batch的处理过程中耦合业务逻辑,原因如下:

    a、Spring Batch的使用目的更加清晰

    b、避免Spring Batch事务与业务逻辑事务的交叉耦合所带来的偶发复杂性,应用已于理解

    其次,Spring Batch的系统表最好和业务数据表处于同一物理库,保证事务的一致性
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146269.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vim常用快捷键

    vim常用快捷键键盘移动(Move)一切都从键盘的移动k ->上upj ->下downh ->左leftl ->右rightz ->重画屏幕,当前光标变成屏幕的第一行(redrawcurrentlineattopofwindow)CTRL-f ->跳到下一页(pagedown)CTRL-b ->跳到上一页(pageup)跳跃

    2022年5月13日
    69
  • matlab中wavedec2函数,小波滤波器–wavedec2函数[通俗易懂]

    matlab中wavedec2函数,小波滤波器–wavedec2函数[通俗易懂]wavedec2函数:1.功能:实现图像(即二维信号)的多层分解.多层,即多尺度.2.格式:[c,s]=wavedec2(X,N,’wname’)[c,s]=wavedec2(X,N,Lo_D,Hi_D)(我不讨论它)3.参数说明:对图像X用wname小波基函数实现N层分解,这里的小波基函数应该根据实际情况选择,具体办法可以:db1、db2、……db45、haar.输出为c,s.c为各层分…

    2022年6月28日
    44
  • innodb事务隔离级别原理_innodb设置事务隔离级别

    innodb事务隔离级别原理_innodb设置事务隔离级别事务隔离级别SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。ReadUncommitted(读取未提交内容)      在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读

    2022年10月10日
    3
  • c++中this指针的用法详解

    c++中this指针的用法详解为什么引入this指针?   最简单的应用场景就是:当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,这个时候我们该怎么办呢?这个时候就是this指针大显身手的时候了。为此我们引入this指针的概念。1.this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this…

    2022年5月13日
    51
  • 【机器学习】代价函数,损失函数,目标函数区别

    【机器学习】代价函数,损失函数,目标函数区别一:损失函数,代价函数,目标函数定义首先给出结论:损失函数(LossFunction)是定义在单个样本上的,算的是一个样本的误差。代价函数(CostFunction)是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。目标函数(ObjectFunction)定义为:最终需要优化的函数。等于经验风险+结构风险(也就是CostFunction+正则化项)。关于目标函数和…

    2022年4月29日
    125
  • edge 浏览器打开总跳向 hao.360

    edge 浏览器打开总跳向 hao.360edge浏览器突然每次打开都跳向hao.360.com注册表查找hao.360.com找不到发线每次调换都会 http://511zdqdkj.yc.anhuang.net先到这个域名拿这个域名搜索也找不到没办法通过改注册表的方式恢复用tengxun管家修改浏览器主页不生效win10升级win11不生效升到win11仍不生效,觉得没办法了就将hao.360.com解析到127.0.0.1至少不用看广告了。后面发现在win11下方的任务栏点击

    2022年7月26日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号