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

循环中新事务的传播(使用REQUIRES_NEW)不能按预期工作

循环中新事务的传播(使用REQUIRES_NEW)不能按预期工作是指在循环中使用REQUIRES_NEW传播行为的事务无法按照预期的方式工作。REQUIRES_NEW是一种事务传播行为,它会创建一个新的事务,并在执行期间挂起当前事务。当循环中的代码块被多次执行时,每次执行都会创建一个新的事务,而不会复用之前的事务。

这种情况可能会导致以下问题:

  1. 数据不一致性:由于每次循环都创建了一个新的事务,可能会导致数据在不同事务之间的不一致性。例如,在循环中更新某个数据字段,如果每次循环都创建了一个新的事务,那么最终数据库中的数据可能是最后一次循环的结果,而不是每次循环的结果的累积。
  2. 性能问题:由于每次循环都创建了一个新的事务,事务的创建和销毁会带来额外的开销,可能会影响系统的性能。特别是在循环次数较多的情况下,事务的频繁创建和销毁可能会导致性能下降。

为了解决循环中新事务的传播不能按预期工作的问题,可以考虑以下几种解决方案:

  1. 调整事务传播行为:可以尝试使用其他的事务传播行为,如REQUIRED或SUPPORTS,根据具体业务需求选择合适的传播行为。REQUIRES_NEW适用于需要独立事务处理的场景,如果不需要独立事务,可以选择其他传播行为。
  2. 优化循环逻辑:如果循环中的代码逻辑可以被优化,尽量减少事务的创建和销毁次数。可以考虑将事务的创建移到循环外部,或者将事务的边界调整到更合适的位置。
  3. 使用批量操作:如果循环中的操作可以批量执行,可以考虑将多次操作合并为一次批量操作,减少事务的创建和销毁次数,提高性能。

总结起来,循环中新事务的传播(使用REQUIRES_NEW)不能按预期工作可能会导致数据不一致性和性能问题。为了解决这个问题,可以调整事务传播行为、优化循环逻辑或使用批量操作来减少事务的创建和销毁次数。

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

相关·内容

面试官:说说Spring中事务传播行为

前言 在开发中,相信大家都使用过Spring事务管理功能。那么,你是否有了解过,Spring事务传播行为呢? Spring中,有7种类型事务传播行为。...如果以后还碰到有人说不要循环嵌套事务的话,可以叫他回去好好看看Spring事务传播行为。 SUPPORTS 如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式继续运行。...根据定义,inserBatch事务会被延缓。具体表现就是:后面的10次循环事务在每次循环结束之后都会提交自己事务,而inserBatch事务,要等循环方法走完之后再提交。...以非事务方式运行,如果当前存在事务,暂停当前事务。这种方式与REQUIRES_NEW有所类似,但是NOT_SUPPORTED修饰方法其本身是没有事务。这里就不做代码演示了。...所以这里就不做演示了 总结 事务传播行为,在开发中可能不会特别的留意到它(更多时候,我们可能只是使用默认方式),但是还是需要对其要有所理解。希望本篇文章能让大家明白Spring7种事务传播行为。

15810

面试官:说说Spring中事务传播行为

前言 在开发中,相信大家都使用过Spring事务管理功能。那么,你是否有了解过,Spring事务传播行为呢? Spring中,有7种类型事务传播行为。...如果以后还碰到有人说不要循环嵌套事务的话,可以叫他回去好好看看Spring事务传播行为。 SUPPORTS 如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式继续运行。...根据定义,inserBatch事务会被延缓。具体表现就是:后面的10次循环事务在每次循环结束之后都会提交自己事务,而inserBatch事务,要等循环方法走完之后再提交。...复制代码 以非事务方式运行,如果当前存在事务,暂停当前事务。这种方式与REQUIRES_NEW有所类似,但是NOT_SUPPORTED修饰方法其本身是没有事务。这里就不做代码演示了。...所以这里就不做演示了 总结 事务传播行为,在开发中可能不会特别的留意到它(更多时候,我们可能只是使用默认方式),但是还是需要对其要有所理解。希望本篇文章能让大家明白Spring7种事务传播行为。

91310
  • 记录一次mybatis缓存和事务传播行为导致ut挂排查过程

    ,这两个传播行为区别在于: REQUIRED:默认spring事务传播级别,使用该级别的特点是,如果上下文中已经存在事务,那么就加入到事务中执行,如果当前上下文中不存在事务,则新建事务执行。...只有在被调用方法中数据库操作需要保存到数据库中,而不管覆盖事务结果如何时,才应该使用 REQUIRES_NEW 事务属性 举个栗子:假设尝试所有股票交易都必须被记录在一个审计数据库中。...如果没有对审计方法使用 REQUIRES_NEW 属性,审计记录就会连同尝试执行交易一起回滚。...红框中就是最外层事务开启老session,绿色框是中间REQUIRES_NEW事务中开启新Session。...REQUIRES_NEW这个传播行为理解就更深刻了。

    57321

    Spring事务传播机制

    总结 上面7种事务传播类型,日常用到基本上就REQUIRED、REQUIRES_NEW、NOT_SUPPORTED这几种。...父方法开启REQUIRED事务,子方法开启REQUIRES_NEW事务 父方法开启Spring默认事务传播类型,子方法开启Spring REQUIRES_NEW事务传播类型 设置insertRoleMenu...父方法开启REQUIRED事务,子方法开启REQUIRES_NEW事务 父方法开启Spring默认事务传播类型,子方法开启Spring REQUIRES_NEW事务传播类型,与上一种不同是,异常产生发生在父方法最后一行...父方法开启REQUIRED事务,子方法开启REQUIRES_NEW事务 父方法开启Spring默认事务传播类型,子方法开启Spring REQUIRES_NEW事务传播类型,异常产生发生在父方法最后一行...错误异常类型 Spring 事务默认捕获异常是RuntimeException,如果代码中执行失败抛出了Exception异常,则事务会失效 总结 以上内容基于日常工作及学习,仅供参考,有兴趣同学也可以买一本

    11210

    Spring声明式事务管理

    事务隔离级别的设置是怎样?更重要是,事务应何时回滚工作?理解如何使用这个注释对于确保在应用程序中获得合适事务支持级别非常重要。...不过,REQUIRED 传播模式会覆盖所有这些内容,允许事务启动并工作,就好像没有设置只读标志一样。 这令我想到了另一个我经常碰到主要陷阱。...REQUIRES_NEW 事务属性总是会在启动方法时启动一个新事务。许多开发人员都错误地使用 REQUIRES_NEW 属性,认为它是确保事务启动正确方法。...注意,清单 11 中两个方法都是公共方法,这意味着它们可以单独调用。当使用 REQUIRES_NEW 属性几个方法通过服务间通信或编排在同一逻辑工作单元内调用时,该属性就会出现问题。...如果没有对审计方法使用 REQUIRES_NEW 属性,审计记录就会连同尝试执行交易一起回滚。使用 REQUIRES_NEW 属性可以确保不管初始事务结果如何,审计数据都会被保存。

    95750

    一篇浅文让你摆脱事务困扰

    啥是事务 事物指的是逻辑上一组操作,这组操作要么全部成功,要么全部失败 同生共死 事务四个特性 ACID 原子性(Atomicity):事物是一个不可分割工作单位,事物中操作要么都发生,要么都不发生...不影响阅读 默认事务 REQUIRED(开启事务后不做任何传播行为说明) 新启事务 REQUIRES_NEW 嵌套事务 NESTED 依赖事务 SUPPORTS 非事务 NOT_SUPPORTED 必须非事务...但是大家要切记, 这段时间只是时间暂停, 资源是在继续使用. 也就是说, 外层事务挂起时, 数据库连接是一直持有状态. 所以你吃饭要快点....如果县城B()没有预期完成任务,我们说抛出异常, 那市级A()会继续执行该市其他任务. 如果市级预期完成, 那么县城任务失败, 市级负责部分任务完成. 此时事务A()提交....):事物是一个不可分割工作单位,事物中操作要么都发生,要么都不发生 方法C()不发生, 其他也不能继续发生 .

    43410

    Spring事务传播机制(最全示例)

    我们在使用Spring框架进行开发时,经常在service层写很多方法,而且这些方法都是带事务,那么Spring事务怎么在多个方法之间传播呢?今天我们就仔细聊一聊。...下面我们就一一演示这7种类型是如何工作。...我们在这两个方法上使用注解,并配置不同传播机制,通过查看数据库是否插入数据成功来演示不同传播机制效果。...REQUIRES_NEW总是创建一个新事务,如果当前存在事务,则挂起当前事务。这句话怎么理解呢?...,innerTransaction()方法传播类型是REQUIRES_NEW,会创建一个新事务,虽然outerTransaction()最后抛出了异常,由于两个方法是两个事务,所以异常只会对外层事务回滚

    12610

    Spring嵌套事务是怎么回滚

    事务传播机制 多数据源切换问题 更深入理解 Spring 事务。 用户注册完成后,需要给该用户登记一门PUA必修课,并更新该门课登记用户数。 为此,我添加了两个表。...为验证异常是否符合预期,在 regCourse() 里抛一个注册失败异常: 执行代码: 注册失败部分异常符合预期,但是后面又多了一个这样错误提示:Transaction rolled back...源码解析 伪代码梳理整个事务结构: 整个业务包含2层事务: 外层 saveUser() 事务 内层 regCourse() 事务 Spring声明式事务propagation属性,表示对这些方法使用怎样事务...SUPPORTS MANDATORY REQUIRES_NEW NOT_SUPPORTED NEVER NESTED 因为: 在 saveUser() 上声明了一个外部事务,就已经存在一个事务了 在propagation...所以只需将传播属性改成 REQUIRES_NEW : 运行: 异常正常抛出,注册课程部分数据没有保存,但用户还是正常注册成功。

    1.4K50

    关于Spring事务管理 之 默认事务间调用问题

    事务概念略; 由事务传播行为我们知道, 如果将方法配置为默认事务(REQUIRED)在执行过程中Spring会为其新启事务(REQUIRES_NEW), 作为一个独立事务来执行...., 目前我们项目开发过程中使用配置文件方式, 一般为以下方式 ....此时#demoService1.doService()事务则为新启事务(REQUIRES_NEW) , 之后再被调用方法#demoService2.doService()会加入到调用者#demoService1...又由于spring事务回滚依托在异常之上, 当demoService2.doService()出现异常后它将事务标记为回滚....但当demoService1在做commit时候检测到事务被标记为回滚, 与预期不符, 也就是Unexpected 意想不到 UnexpectedRollbackException: Transaction

    83330

    Spring事务传播机制及底层原理解析

    REQUIRES_NEW (需要新): 总是创建一个新事务,如果当前存在事务,则把当前事务挂起,新事务结束后,再恢复之前被挂起事务。 5....通过在Service层方法上使用 `@Transactional` 注解,并设置其 `propagation` 属性,可以指定事务传播行为,以满足不同场景下事务管理需求。...Spring事务传播机制底层原理涉及到Spring AOP(面向切面编程)和事务管理器协同工作。...事务决策: - 根据`@Transactional`注解声明事务传播属性,代理对象决定如何处理事务: - 创建新事务(如`REQUIRES_NEW`) - 加入现有事务(如...事务传播具体实现: - 事务传播实际动作由事务管理器来执行,比如当需要创建新事务时,事务管理器会调用连接(如JDBC Connection或Hibernate Session)相关API来启动和管理事务

    54010

    Transactional事物注解(十一)

    propagation() default Propagation.REQUIRED; Propagation 就是支持事物传播类型了,定义了 7 个枚举,下面分别来讲解 REQUIRED 支持当前事务...MANDATORY 支持当前事务,如果不存在则抛出异常 REQUIRES_NEW 创建一个新事务,并暂停当前事务(如果存在) // REQUIRED parent { s1(); // REQUIRED...,则子事物会一起回滚,相反,子事物异常,则父事务可以选择回滚还是提交 以上事物传播类型含义,在源码中有写,翻译成中文就是如上所示含义。...其他事物表现都差不多。 事物传播测试 如果要测试事物传播类型的话,可以使用 Junit 来测试,当然是要在之前 stu 测试服务去写测试代码....,执行创建、更新等操作,然后在里面抛出异常,之类手段进行查看事物是否按照设置事物传播类型表现生效。

    63110

    面试专题:深入事务传播行为,绕晕面试官

    前言关于事务,大家都知道怎么用吧,当我们需要在使用事务方面加注解@Transation即可,但是,其实关于事务还有很多属性可以配置,比如事务传播信息,配置参数:propagation,可以指定事务传播行为...通过了解这些事务传播行为,开发者可以更好地掌握Spring事务管理核心原理,并在实际开发中合理地使用事务传播行为来保证事务正确性和一致性。...在需要更细粒度控制事务传播时,可以考虑使用其他传播行为。...REQUIRED和REQUIRES_NEW案例演示虽然事务有七种事务传播行为,但是在开发中比较常用主要是REQUIRED和REQUIRES_NEW这两种,接下来就开始讲解这两种不同传播行为在实际开发中应用场景...signLogService保存用户id1233成功lotteryService保存主题SDEF失败第二种:不同事务代理类 + REQUIRES_NEW第二种方式就是使用REQUIRES_NEW传播属性

    37230

    事务传播行为 隔离级别 异常回滚策略

    事务传播行为 事务传播行为;propagation:当前方法事务[是否要和别人公用一个事务]如何传播下去(里面的方法如果用事务,是否和他公用一个事务) Propagation propagation...如果以前有事务,就和之前事务公用一个事务,没有就创建一个事务REQUIRES_NEW(总是用新事务): Create a new transaction, and suspend...the current transaction if one exists 不支持在事务内运行,如果已经有事务了,就挂起当前存在事务 NEVER(从不使用): Execute...A,B,D都成,C自己回滚 总结: 对这段代码而言 传播行为过程中,只要Requires_new被执行过就一定成功,不管后面出不出问题。异常机制还是一样,出现异常代码以后不执行。...和外事务是什么传播行为无关。 传播行为总是来定义,当一个事务存在时候,他内部事务该怎么执行。

    55620

    18个示例详解 Spring 事务传播机制

    什么是事务传播机制 事务传播机制,顾名思义就是多个事务方法之间调用,事务如何在这些方法之间传播。...传播属性 Propagation 枚举 Spring 对事务传播机制在 Propagation 枚举中定义了7个分类: REQUIRED 默认 SUPPORTS 支持 MANDATORY 强制 REQUIRES_NEW...NEVER 方法不使用事务,调用 NEVER 方法如果有事务,就抛出异常。...对比示例17和示例18,NESTED 和 REQUIRED 区别: REQUIRED 传播属性表明调用方和被调用方都是使用同一个事务,被调用方出现异常,无论异常是否被捕获,因为属于同一个事务,只要发生异常...强制调用方添加事务,如果不存在事务就报错,存在事务就加入该事务 REQUIRES_NEW 无论调用方是否存在事务,都会创建新事务,并且调用方异常不会影响 REQUIRES_NEW事务 NOT_SUPPORTED

    1.9K10

    浅谈Spring事务隔离级别与传播行为

    隔离级别 隔离性(Isolation)作为事务特性一个关键特性,它要求每个读写事务对象对其他事务操作对象能相互分离,即该事务提交前对其他事务都不可见,在数据库层面都是使用锁来实现。...在Spring中,当一个方法调用另外一个方法时,可以让事务采取不同策略工作,如新建事务或者挂起当前事务等,这便是事务传播行为。...定义 在Spring事务机制中对数据库存在7种传播行为,通过枚举类Propagation定义。...* 只回滚子方法执行过SQL,而不回滚当前方法事务 */ NESTED(6); ...... } 日常开发中基本只会使用到REQUIRED(0),REQUIRES_NEW...NESTED和REQUIRES_NEW是有区别的。NESTED传播行为会沿用当前事务隔离级别和锁等特性,而REQUIRES_NEW则可以拥有自己独立隔离级别和锁等特性。

    92250

    面试突击87:说一下 Spring 事务传播机制?

    既然是“事务传播”,所以事务数量应该在两个或两个以上,Spring 事务传播机制诞生是为了规定多个事务传播过程中行为。...事务传播机制使用与演示 接下来我们演示一下事务传播机制使用,以下面 3 个最典型事务传播级别为例: 支持当前事务 REQUIRED; 不支持当前事务 REQUIRES_NEW; 嵌套事务 NESTED...执行流程描述: UserController 中调用了 UserService 添加用户方法,UserService 使用 NESTED 循环嵌套事务,并成功执行了添加用户方法。...UserService 中调用了 LogService 添加方法,LogService 使用了 NESTED 循环嵌套事务,但在方法执行中出现异常,因此回滚了当前事务。...事务传播级别有 7 个,支持当前事务:REQUIRED、SUPPORTS、MANDATORY;不支持当前事务REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED

    35610

    Spring MVC系列-(6) 声明式事务

    事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomicity)。一个事务是一个不可分割工作单位,事务中包括操作要么都做,要么都不做。...6.3 Spring事务隔离级别与传播性 隔离级别 隔离性(Isolation)作为事务特性一个关键特性,它要求每个读写事务对象对其他事务操作对象能相互分离,即该事务提交前对其他事务都不可见,在数据库层面都是使用锁来实现...传播行为 在Spring中,当一个方法调用另外一个方法时,可以让事务采取不同策略工作,如新建事务或者挂起当前事务等,这便是事务传播行为。...,如果子方法发生异常 * 只回滚子方法执行过SQL,而不回滚当前方法事务 */ NESTED(6); } 日常开发中基本只会使用到REQUIRED(0),REQUIRES_NEW...NESTED和REQUIRES_NEW是有区别的。NESTED传播行为会沿用当前事务隔离级别和锁等特性,而REQUIRES_NEW则可以拥有自己独立隔离级别和锁等特性。

    17210

    深入理解 Spring 事务:入门、使用、原理

    其中最常用只有 3 种,即:REQUIRED、REQUIRES_NEW、NESTED。 针对事务传播类型,我们要弄明白是 4 个点: 子事务与父事务关系,是否会启动一个新事务?...REQUIRES_NEW REQUIRES_NEW 也是常用一个传播类型,该传播类型特点是:无论当前方法是否存在事务,子方法都新建一个事务。此时父子方法事务时独立,它们都不会相互影响。...但父方法需要注意子方法抛出异常,避免因子方法抛出异常,而导致父方法回滚。 为了验证 REQUIRES_NEW 事务传播类型特点,我们来做几个测试。...看到这里,你应该也明白:使用事务,不再是简单地使用 @Transaction 注解就可以,还需要根据业务场景,选择合适传播类型。那么我们再升华一下使用 Spring 事务方法论。...一般来说,使用 Spring 事务步骤为: 根据业务场景,分析要达成事务效果,确定使用事务传播类型。

    3.1K20

    spring源码分析之事务transaction下篇

    上一篇文章已经详细分析了spring中如何创建事务(spring源码分析之事务transaction上篇),今天这篇文章主要是介绍spring中事务回滚、事务提交、以及使用事务注意事项。...这篇文章与上一篇文章有强关联,建议先去看上篇 一、事务回滚 我们只分析常用传播属性REQUIRED(默认)、REQUIRES_NEW、NESTED,其他可以自行阅读,也比较简单。...二、事务提交 事务提交分下面几种情况分析,其实理解了事务回滚,再看事务提交会更加简单 1.第二个传播属性为REQUIRED 2.第二个传播属性为REQUIRES_NEW 3.第二个传播属性为NESTED...2.第二个传播属性为REQUIRES_NEW 这种情况第一个事务和第二个事务连接不同,并且第一个事务被挂起了,第二个事务newTransaction=true。...也不会生效 4.可以根据业务需求,使用catch处理异常不网上抛,来达到特定业务需求 这种情况就是不让里层事务影响到外层事务,可以使用catch捕获异常,然后吞掉不往外抛出。

    26520
    领券