事务模型描述

1、step之间事务独立
2、step划分成多个chunk执行,chunk事务彼此独立,互不影响;chunk开始开启一个事务,正常结束提交。chunk表示给定数量的item的操作集合,主要属性commit-interval,表示数量达到多少条提交一次。
    
图-job总体事务
 
图-step内部事务
 
3、chunk定义:默认设置commitInterval=N,即读取N条数据为一个chunk(采用默认SimpleCompletionPolicy),或者reader里面所读取的item==null,或者满足自定义完成策略  
    
 
事务提交&回滚
1、事务必须添加<batch:tasklet>标记,它表示step的一个事务过程,包含事务的重启,同步,异步,并发等策略。
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提供了很多监听器等组件,在处理事务相关的问题时,参考下图进行事务考虑:
   
 图-job执行阶段轨迹&事务
 
    注意:ItemReadeListener、ItemProcessListener、ItemWriteListener所有监听方法均在chunk事务当中执行,所以,如果在这些监听方法里面要处理好业务事务与chunk事务的关系,最好将业务事务设置为独立REQUIRE_NEW特性,避免相互影响
    关于onXXError监听方法:改监听方法在事务回滚之前执行,或者事务提交之前执行(如果有no-rollback-exception配置)
 
 
一点点建议
 
    在使用Spring Batch的时候需要注意它要解决的问题域,它本身的关注点应该是提供一个批量处理的能力,即对文件或数据库的批量读取、写入和协议数据的转换,以及对整个过程的控制。
    因此,如果在批量处理过程中需要做些业务逻辑,那么业务逻辑的实现需要与它彼此独立,尽量不要在batch的处理过程中耦合业务逻辑,原因如下:
    a、Spring Batch的使用目的更加清晰
    b、避免Spring Batch事务与业务逻辑事务的交叉耦合所带来的偶发复杂性,应用已于理解
    其次,Spring Batch的系统表最好和业务数据表处于同一物理库,保证事务的一致性
 

Spring Batch事务处理的更多相关文章

  1. Spring Batch 中文参考文档 V3.0.6 - 1 Spring Batch介绍

    1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括 ...

  2. Spring batch学习 (1)

    Spring Batch 批处理框架 埃森哲和Spring Source研发 主要解决批处理数据的问题,包含并行处理,事务处理机制等.具有健壮性 可扩展,和自带的监控功能,并且支持断点和重发.让程序员 ...

  3. spring batch(二):核心部分(1):配置Spring batch

    spring batch(二):核心部分(1):配置Spring batch 博客分类: Spring 经验 java   chapter 3.Batch configuration 1.spring ...

  4. Spring Batch基本概念

    Spring batch主要有以下部分组成: JobRepository     用来注册job的容器 JobLauncher             用来启动Job的接口 Job           ...

  5. Spring Batch在大型企业中的最佳实践

    在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...

  6. spring batch资料收集

    spring batch官网 Spring Batch在大型企业中的最佳实践 一篇文章全面解析大数据批处理框架Spring Batch Spring Batch系列总括

  7. Spring Batch学习笔记三:JobRepository

    此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用H ...

  8. Spring Batch学习笔记二

    此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自 ...

  9. 初探Spring Batch

    此系列博客皆为学习Spring Batch时的一些笔记: 为什么我们需要批处理? 我们不会总是想要立即得到需要的信息,批处理允许我们在请求处理之前就一个既定的流程开始搜集信息:比如说一个银行对账单,我 ...

随机推荐

  1. HDU Bomb Game 3622 (2-Sat)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. openstack XXX-api分析

    一.概述 RESTful API: 表征状态迁移,也就是说client端使用http的基本操作(主要四种:get, post, put, delete 对应增删改查)使服务端的资源状态转化: WSGI ...

  3. 【Oracle】Oracle 的过程化SQL(PLSQL)中NULL值的处理

    下面是NULL的几个注意点: 1.NULL值既不是空格也不是0. 2.给表插入值的时候,如果没有给列指定列值,则默认为NULL. 3.当算术表达式里包含NULL值时,其计算结果也是NULL值. 这时候 ...

  4. java php 等,路径 上级路径,上上级路径表示方法

    如何表示上级目录 ../表示源文件所在目录的上一级目录,../../表示源文件所在目录的上上级目录,以此类推. ../表示源文件所在目录的上一级目录,../../表示源文件所在目录的上上级目录,以此类 ...

  5. 搭建自己的 github.io 博客

    1.前言 github.io 是基于 Github 的 repo 管理,这意味着咱们对其是有绝对的控制,这个跟放在第三方的平台比,可控性要好太多. 使用 github pages 服务搭建博客的好处有 ...

  6. React Native工程修改Android包名

    默认初始化的React Native工程,生成Android工程的时候,包名默认是React Native工程的名字,跟一般Android工程com.company.xxx不一样. 这时候就需要手动修 ...

  7. Nginx启动/重启脚本详解

    Nginx手动启动 停止操作 停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的步骤1:查询nginx主进程号ps -ef | grep nginx在进程列表里 面找m ...

  8. 【转】Oracle回收站(recyclebin)

    我们都比较熟悉windows中的回收站,文件删除后放到回收站里还可以再复原.Oracle回收站的原理完全一样,只是实现的细节方面有些差异.另外回收站中只能回收表和相关的对象包括索引.约束.触发器.嵌套 ...

  9. 收集一些有意思的ASCII程序注释(持续收集中,希望大家踊跃贡献)

      /** * * created by Mr.Simple, Aug 21, 20141:51:40 PM. * Copyright (c) 2014, hehonghui@umeng.com Al ...

  10. 如何改变git的默认路径

    1.win10下git默认启动路径是用户的根目录,东西太多太乱了. 2.修改很容易,右键单击桌面的快捷方式,选择“属性”. 3.删除“目录”中的 --cd-to-home 选项,再将“起始位置&quo ...