首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring Batch步骤不立即提交事务

Spring Batch是一个用于批处理应用程序开发的框架,它提供了一种简单且强大的方式来处理大量的数据。在Spring Batch中,步骤(Step)是批处理的基本单元,它定义了一系列的任务和处理逻辑。

在默认情况下,Spring Batch的步骤会立即提交事务。这意味着每个步骤的所有操作都会在一个事务中执行,并且在步骤完成后立即提交事务。这种方式适用于大多数情况,但在某些特殊情况下,我们可能希望在步骤执行完毕后再提交事务。

为了实现步骤不立即提交事务,我们可以使用Spring Batch提供的事务控制机制。具体而言,我们可以通过配置事务属性来控制步骤的事务提交行为。

在Spring Batch中,事务属性可以通过@Transactional注解或XML配置来定义。我们可以将事务属性设置为NOT_SUPPORTED,这样步骤就会在执行期间暂时挂起事务,并在步骤完成后再恢复事务。

以下是一个示例的步骤配置,展示了如何实现步骤不立即提交事务:

代码语言:txt
复制
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private DataSource dataSource;

    @Bean
    public Step myStep() {
        return stepBuilderFactory.get("myStep")
                .transactionAttribute(transactionAttribute())
                .tasklet(myTasklet())
                .build();
    }

    @Bean
    public Tasklet myTasklet() {
        return (contribution, chunkContext) -> {
            // 执行步骤的逻辑
            return RepeatStatus.FINISHED;
        };
    }

    @Bean
    public DefaultTransactionAttribute transactionAttribute() {
        DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
        attribute.setPropagationBehavior(Propagation.NOT_SUPPORTED.value());
        return attribute;
    }

    @Bean
    public Job myJob() {
        return jobBuilderFactory.get("myJob")
                .start(myStep())
                .build();
    }
}

在上述示例中,我们通过transactionAttribute()方法创建了一个DefaultTransactionAttribute对象,并将其设置为NOT_SUPPORTED传播行为。然后,我们在步骤配置中使用transactionAttribute()方法来指定步骤的事务属性。

通过以上配置,Spring Batch的步骤将不会立即提交事务,而是在步骤执行完毕后再提交事务。这样可以在步骤执行期间暂时挂起事务,从而提高性能和效率。

推荐的腾讯云相关产品:腾讯云批量计算(BatchCompute),它是腾讯云提供的一种高性能、高可靠、易扩展的批量计算服务。您可以通过以下链接了解更多关于腾讯云批量计算的信息:腾讯云批量计算产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Batch 事务限制

Spring Batch 有所了解的同学都知道 Batch 是用来进行批量数据处理的。但是我们在同时使用 Spring JPA 的时候,尤其是循环数据处理的时候,我们希望能够尽快提交事务。...但是,Spring Batch 中,如果使用了 Tasklet 的话,那么Spring 会在 Tasklet 级别创建一个事务。在 Tasklet 不完成的情况下,事务是不会提交的。...事务都是没有办法提交的。简单的办法就是针对上面的操作使用不同的 Tasklet 来做。有人问过,能不能在循环中一次一次的进行提交。...Spring Batch 这样设计的目的就是为了保持数据的完整性,因此需要对 Batch 的逻辑进行考虑,而建议考虑怎么省事怎么来。...https://www.ossez.com/t/spring-batch/14148

56620

Spring Batch事务处理

事务模型描述 1、step之间事务独立 2、step划分成多个chunk执行,chunk事务彼此独立,互不影响;chunk开始开启一个事务,正常结束提交 图-job 总体事务...里面所读取的item==null,或者 满足自定义完成策略 事务提交&回滚 1、事务提交条件:chunk执行正常,未抛RuntimeExecption 2、默认情况下,Reader、...比如:文件处理时,chunkSize=10,在line=35时处理失败,文件修复后,job将从31行开始重新处理(因为1-10,11-20,21-30进行事务提交Spring Batch将ExecutionContext...Spring Batch提供了很多监听器等组件,在处理事务相关的问题时,参考下图进行事务考虑: 图-job执行阶段轨迹&事务 注意:ItemReadeListener...b、避免Spring Batch事务与业务逻辑事务的交叉耦合所带来的偶发复杂性,应用已于理解 其次,Spring Batch的系统表最好和业务数据表处于同一物理库

1.5K21

Spring Batch 配置一个步骤(Step)

如我们在 域语言(Domain Language)章节中讨论的内容一致,一个 步骤(Step)是一个独立封装了执行顺序的批量作业(Job),并且包含有用于定义和控制一个批量作业的所有独立信息。...针对这个 Step 的定义必然是非常模糊的,因为任何一个给定步骤的内容都会被要求开发人员在编写一个作业(job)的时候被描述。 一个步骤(Step)可以根据开发人员的需求被开发为简单或者复杂。...一个简单的步骤可能就仅仅是从文件中载入数据然后写入到数据库中,可能并不需要太多的代码或者甚至都不需要代码(这个取决你需要的实现)。...一个步骤(Step)也可能会比较复杂,这是因为你将要在数据处理的过程中实现一些复杂的业务规则,如下图所示: 图片 1....步骤(Step) https://www.cwiki.us/display/SpringBatchZH/Configuring+a+Step

43340

Spring Batch 配置一个步骤(Step)

如我们在 域语言(Domain Language)章节中讨论的内容一致,一个 步骤(Step)是一个独立封装了执行顺序的批量作业(Job),并且包含有用于定义和控制一个批量作业的所有独立信息。...针对这个 Step 的定义必然是非常模糊的,因为任何一个给定步骤的内容都会被要求开发人员在编写一个作业(job)的时候被描述。 一个步骤(Step)可以根据开发人员的需求被开发为简单或者复杂。...一个简单的步骤可能就仅仅是从文件中载入数据然后写入到数据库中,可能并不需要太多的代码或者甚至都不需要代码(这个取决你需要的实现)。...一个步骤(Step)也可能会比较复杂,这是因为你将要在数据处理的过程中实现一些复杂的业务规则,如下图所示: ? 图片 1....步骤(Step) https://www.cwiki.us/display/SpringBatchZH/Configuring+a+Step

63530

Spring 事务提交回滚源码解析

本文首发于个人公众号 Java 技术大杂烩,欢迎关注 前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring 是如何去获取事务...此外,事务提交和回滚由底层数据库进行控制,而 Spring 事务行为可以传播,这个传播方式由 Spring 来进行控制,它是怎么控制的呢?这篇文章就来分析下 Spring 事务提交回滚的源码。...编程式事务,流程和声明式事务一致 } } 一个事务方法执行流程大概有以下几个步骤: 获取事务属性 获取事务管理器 获取需要事务的方法名称 获取该方法上事务的信息 目标方法执行 事务回滚 清除事务信息...事务提交 获取事务属性 首先去获取方法上面 @Translational 注解的属性,在 Spring 事务初始化源码分析 已经分析过了,即在 AnnotationTransactionAttributeSource.computeTransactionAttribute...事务的获取,提交,回滚去分析完毕了,流程还是比较清楚的。

1.3K11

Spring Batch步骤任务、并行执行、任务决策器、任务嵌套

Spring Batch是一个轻量级但功能又十分全面的批处理框架,旨在支持开发对企业系统的日常运营至关重要的批处理应用程序。...Spring Batch 提供了在处理大量记录时必不可少的可重用功能,包括日志记录/跟踪、事务管理、作业处理统计、作业重新启动、跳过和资源管理。... 在编写代码之前,我们先来简单了解下Spring Batch的组成: Spring Batch里最基本的单元就是任务...新建一个MySql数据库,导入 org.springframework.batch:spring-batch-core目录下的schema-mysql.sql文件 导入后,库表如下图所示: 然后在项目的配置文件...: initialize-schema: always 接着在Spring Boot的入口类上添加@EnableBatchProcessing注解,表示开启Spring Batch批处理功能

2.4K20

spring事务为什么生效,回滚失效,事务try catch

Spring事务的原理 Spring事务的本质其实就是数据库Innodb对事务的支持,没有innodb是事务支持,spring是无法提供事务支持的。...真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。..., root); 开启事务connection .setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 connection .commit() / connection...}catch(Exception e ){ connection .rollback(); } 使用Spring事务管理功能后,我们可以不再写步骤 2 和 4...新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以处理回滚操作 PROPAGATION_SUPPORTS

3.1K10

fix bug:Spring事务生效的问题

事务注解生效的问题 出现该问题的主要原因主要有两点: Spring事务没有生效 出现异常时无法正常回滚 Spring事务生效的情况 @Transactional用在非public方法上 未通过代理手段调用事务方法...正常注入Spring中,在调用方法时使用This调用事务方法,Spring不会注入this,所以无法使用事务。...多次数据库操作,未配置事务传播 事务生效不能回滚的情况: try/catch包裹标记了@Transactional注解的方法,方法满足一定条件时才会回滚。...②:默认情况下,出现RunTimeException(非受检异常)或Error的时候,Spring才会回滚事务。...③:catch的作用就是捕捉方法中的异常,使回滚传播到外层事务,以免对其他事务产生影响。

72210

parallelStream与Spring事务相遇?不是冤家聚头~

初步猜测,是事务未生效导致的。 查看代码,发现导入部分已经通过@Transcational注解进行事务控制了,为什么还会出现事务生效的问题呢? 下面我们就进行具体的案例分析,Let’s go!...事务生效的代码 这里写一段简单的伪代码来演示展示一下事务生效的代码: @Transactional(rollbackFor = Exception.class) public void batchInsert...基本原理:当一个方法被@Transactional注解之后,Spring会基于AOP在方法执行之前开启一个事务。当方法执行完毕之后,根据方法是否报错,来决定回滚或提交事务。...在默认代理模式下,只有目标方法由外部方法调用时,才能被Spring事务拦截器拦截。所以,在同一个类中的两个方法直接调用,不会被Spring事务拦截器拦截。...这是事务生效的一个场景,但在上述案例中,并不存在这种情况。

1.2K20

【小家java】Spring事务生效的原因大解读

因此我们在使用spring事务的时候,门槛变得异常的低,小学生水平就能很好的管理好事务,但是同学们或多或少都遇见过一些事务生效的难题,为啥呢?...需要改成InnoDB才能支持 **原因二:**入口的方法必须是public,否则事务不起作用(这一点由Spring的AOP特性决定的,理论上而言,public也能切入,但spring可能是觉得private...另外private 方法, final 方法 和 static 方法不能添加事务,加了也生效 **原因三:Spring事务管理默认只对出现运行期异常(java.lang.RuntimeException...) **原因六:**请确保你的业务和事务入口在同一个线程里,否则事务也是生效的,比如下面代码事务生效: @Transactional @Override public void save(User...图六:事务生效(准确的说这叫没有事务) ? 图七:事务生效。这里必须说几句:这是我们解决方法内部调用事务生效的最常用方法之一:内部维护一个注入自己的Bean,然后使用这个属性来调用方法。

2.9K30

Spring声明式与编程式事务的区别,事务与非事务方法相互调用导致的事务生效问题

缺点: 声明式事务有一个局限,那就是他的最小粒度要作用在方法上。除此之外,还有几种场景下会导致声明式事务生效。...问题二:未将 Bean 交由 Spring 进行管理 使用 Spring 的声明式事务,那么需要执行事务的 Bean 是否已经交由了 Spring 管理?...❝ Spring 默认抛出了未检查 unchecked 异常(继承自 RuntimeException 的异常)或者 Error 才回滚事务;其他异常不会触发回滚事务,已经执行的 SQL 会提交掉。...」,所以即使我们在外部事务中 catch 了抛出的异常,整个事务仍然无法正常提交,并且如果你希望正常提交Spring 还会抛出一个异常。...哪里来这么多坑:https://mp.weixin.qq.com/s/NjYsZu8vRvajWNrPCtLeFg Spring官方都推荐使用的@Transactional事务,为啥我建议使用!

1.1K41

Spring事务提交和回滚机制,以及分布式事务的处理解决方案

Spring事务提交和回滚机制如下:提交机制:Spring事务的默认提交机制是自动提交。当事务方法顺利执行完成(没有抛出异常)时,Spring会自动将事务提交到数据库中保存。...回滚机制:Spring事务的回滚机制可以分为两种情况:未检查异常(unchecked exception):当事务方法抛出未检查异常时,Spring会自动回滚事务。...,Spring事务会根据异常类型是否为检查异常以及是否配置了回滚异常类型来决定是否回滚事务。...对于分布式事务的处理,Spring提供以下支持和解决方案:JTA(Java Transaction API)事务管理器:Spring支持使用JTA事务管理器来处理分布式事务。...这些事务管理器提供了分布式事务的管理功能,可以与Spring事务管理机制无缝集成。数据库XA事务Spring通过使用JDBC的XA连接和XA事务来管理在多个数据库之间的分布式事务

46991

Spring事务监听机制---使用@TransactionalEventListener处理数据库事务提交成功后再执行操作(附:Spring4.2新特性讲解)【享学Spring

前言 从标题就可以看出,本篇文章内容既和Spring的事件/监听机制有关,同时还和Spring事务以及Spring事务同步机制有关。...】【消息队列MQ】【EventSourcing】… Spring事务同步机制: 【小家SpringSpring是如何保证同一事务获取同一个Connection的?...,所以一般会放在异步线程里去执行~ 关于这么执行的情况,上篇文章大篇幅解释了:这样可能会出现业界经典的事务提交成功后进行异步操作问题。...注解(需要Spring4.2+) 办法1在上篇文章,那么本文将叙述通过方式二,来更加优雅的处理Spring事务同步问题。...log.info(source + ":" + count.toString()); //我是和事务相关的事件,请事务提交后执行我~~~:1 } }

9.5K92

聊聊spring事务在异常场景下发生按套路出牌的事儿

01 前言 最近看了一下网上总结的spring事务失效的N个场景,网上列出来的场景有如下 数据库引擎不支持事务 没有被 Spring 管理 方法不是 public 的 自身调用问题 数据源没有配置事务管理器...NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci 02 一份按编码规范来的..., ex); throw ex; } finally { cleanupTransactionInfo(txInfo); } 这个是spring...} 得到如下结果 答案: 发生了回滚,无法插入成功 看到这个答案,可能有些朋友会一脸懵逼,为啥上个例子把异常捕获了,数据可以插入成功,这次也是同样把异常捕获,数据却无法插入成功 原因: 这就得从spring...事务的传播行为说起了,spring事务的默认传播行为是REQUIRED。

34210

聊聊spring事务在异常场景下发生按套路出牌的事儿

前言 最近看了一下网上总结的spring事务失效的N个场景,网上列出来的场景有如下 数据库引擎不支持事务 没有被 Spring 管理 方法不是 public 的 自身调用问题 数据源没有配置事务管理器...DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci 2、一份按编码规范来的...在这里插入图片描述] 答案: 发生了回滚,无法插入成功 看到这个答案,可能有些朋友会一脸懵逼,为啥上个例子把异常捕获了,数据可以插入成功,这次也是同样把异常捕获,数据却无法插入成功 原因: 这就得从spring...事务的传播行为说起了,spring事务的默认传播行为是REQUIRED。...按照REQUIRED这个八股文的含义是如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务 在示例中 @Transactional public void saveTxTestC

51430

掌握 @transactional 注解@Transactional 注解管理事务的实现步骤Spring 的注解方式的事务实现机制

@Transactional 注解管理事务的实现步骤 第一步,在配置文件中添加事务配置信息 除了用配置文件的方式,@EnableTransactionManagement 注解也可以启用事务管理功能。...readOnly=true) @Service(value ="employeeService") public class EmployeeService 到此,您会发觉使用@Transactional 注解管理事务的实现步骤很简单...,并执行目标方法的逻辑, 最后根据执行情况是否出现异常,利用抽象事务管理器(图 2 有相关介绍)AbstractPlatformTransactionManager 操作数据源 DataSource 提交或回滚事务...image 注解方式的事务使用注意事项 当您对 Spring 的基于注解方式的实现步骤事务内在实现机制有较好的理解之后,就会更好的使用注解方式的事务管理,避免当系统抛出异常,数据不能回滚的问题。...正确的设置@Transactional 的 propagation 属性 需要注意下面三种 propagation 可以启动事务

84260

批处理框架spring batch基础知识介绍「建议收藏」

Spring Batch提供了可重用的功能,这些功能对于处理大量的数据至关重要,包括记录/跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理。...其对应的示意图如下: spring batch的一个总体的架构如下: 在spring batch中一个job可以定义很多的步骤step,在每一个step里面可以定义其专属的ItemReader用于读取数据...每个StepExecution都包含对其相应步骤的引用以及JobExecution和事务相关的数据,例如提交和回滚计数以及开始和结束时间。...,因此spring batch提供了chunk这个概念,我们可以设定一个chunk size,spring batch 将一条一条处理数据,但不提交到数据库,只有当处理的数据数量达到chunk size...如何默认启动job 在使用java config使用spring batch的job时,如果不做任何配置,项目在启动时就会默认去跑我们定义好的批处理job。

1.1K30
领券