Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java一分钟之-JPA事务管理:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW等

Java一分钟之-JPA事务管理:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW等

作者头像
Jimaks
发布于 2024-06-15 02:47:41
发布于 2024-06-15 02:47:41
51500
代码可运行
举报
文章被收录于专栏:大数据大数据
运行总次数:0
代码可运行

Java企业应用开发中,事务管理是确保数据一致性的重要机制。Java Persistence API (JPA) 通常与Spring框架集成,利用Spring的事务管理功能来处理数据库操作的原子性。Spring事务传播行为是事务管理的核心概念之一,其中PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEW是最常用的两种传播行为。本文将深入浅出地解析它们的含义、应用场景、常见问题、易错点及避免策略,并提供代码示例。

image.png
image.png

1. 事务传播行为简介

PROPAGATION_REQUIRED

这是最常用的传播行为。如果当前没有事务,就新建一个事务;如果已经存在一个事务中,则加入到这个事务中。这保证了业务方法的执行总是在事务中。

易错点:误以为在嵌套事务中,外层事务的回滚会自动触发内层事务的回滚。

避免策略:理解PROPAGATION_REQUIRED的合并事务特性,对于需要独立事务的场景,应选择其他传播行为。

PROPAGATION_REQUIRES_NEW

此传播行为总是创建一个新的事务,并且在新事务中执行。如果当前存在事务,它会被挂起直到新事务完成。

常见问题:过度使用导致事务过多,影响性能和资源消耗。

避免策略:仅在确实需要独立事务,以隔离外层事务影响时使用。谨慎评估事务边界,避免不必要的事务开销。

2. 应用场景与代码示例

PROPAGATION_REQUIRED 示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Transactional(propagation = Propagation.REQUIRED)
public void updateAndSendEmail(User user) {
    userRepository.save(user);
    emailService.sendConfirmationEmail(user.getEmail());
}

在这个例子中,updateAndSendEmail方法在一个事务中更新用户信息并发送邮件。如果邮件发送失败,整个操作都会回滚。

PROPAGATION_REQUIRES_NEW 示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logActivityInNewTransaction(UserActivity activity) {
    activityRepository.save(activity);
}

假设有一个记录用户活动的方法,我们希望即使调用者方法回滚,活动记录也应该保存成功。这时使用PROPAGATION_REQUIRES_NEW来启动一个独立的事务。

3. 结论与建议

正确理解和应用事务传播行为是保证应用数据一致性的关键。PROPAGATION_REQUIRED适合大多数常规操作,保证操作的原子性。而PROPAGATION_REQUIRES_NEW则用于需要确保特定操作独立完成的场景,比如日志记录、发送通知等,即使外部事务失败也不受影响。

开发者在设计事务策略时,应充分考虑业务需求,避免过度使用新事务导致性能下降。同时,合理利用Spring的事务管理特性,如异常捕获机制来决定事务的提交或回滚,可以进一步增强应用的健壮性。通过监控和日志,持续评估事务策略的有效性和性能影响,是优化事务管理的重要手段。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring JDBC-Spring对事务管理的支持
Spring为事务管理提供了一致的编程模板,在高层次建立了统一的事务抽象。也就是说,不管选择Spring JDBC、Hibernate 、JPA 还是iBatis,Spring都让我们可以用统一的编程模型进行事务管理。
小小工匠
2021/08/17
6450
面试专题:深入事务的传播行为,绕晕面试官
关于事务,大家都知道怎么用吧,当我们需要在使用事务的方面加注解@Transation即可,但是,其实关于事务还有很多属性可以配置,比如事务传播信息,配置参数:propagation,可以指定事务的传播行为。所以本文将主要介绍了Spring中事务传播行为的概念、作用以及Spring支持的7种事务传播行为。通过了解这些事务传播行为,开发者可以更好地掌握Spring事务管理的核心原理,并在实际开发中合理地使用事务传播行为来保证事务的正确性和一致性。并且将详细介绍两种常用传播行为REQUIRED和REQUIRES_NEW的不同。
小明爱吃火锅
2023/12/21
4231
说说Spring事务的传播机制
最后琪姐说,修改了Spring的事务传播机制好了(应该是从默认的Required => Requires_New)。
春哥大魔王
2019/07/31
6960
Spring事务—总结
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。注释配置是目前流行的使用方式,因此本文将着重介绍基于@Transactional 注解的事务管理。
用户5325874
2020/01/16
3.4K2
Spring事务—总结
Spring中,多个service发生嵌套,事务是怎么样的?
最近在项目中发现了一则报错:“org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only”。根据报错信息来看是spring框架中的事务管理报错:事务回滚了,因为它被标记为回滚状态。
小忽悠
2019/12/02
1.1K0
Spring中,多个service发生嵌套,事务是怎么样的?
Spring事务传播机制
转载自 https://www.cnblogs.com/softidea/p/5962612.html
allsmallpig
2021/02/25
4130
深入理解 Spring 事务原理
深入理解 Spring 事务原理 一、事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn
用户1289394
2018/02/28
9960
每日一题:SpringBoot中支持的事务类型
作用:如果当前存在事务,则方法将在该事务中运行;如果不存在事务,则创建一个新的事务。适用于大多数业务场景,确保方法在事务中执行,如果没有事务,则创建一个新的事务。
程序员朱永胜
2023/08/17
2740
Spring学习笔记 事务管理
所谓事务,指的是程序中可运行的不可分割的最小单位。在生活中事务也是随处可见的。比方说你在Steam上剁手买了一款游戏,那么付款就是一个事务,要么付款成功,游戏到手;要么付款失败,钱退回你账户。不可能也绝不应该出现花了钱游戏却没到的情况。所以,事务也应该具有两个操作:成功时候提交,或者失败时候回滚。
乐百川
2022/05/05
3890
spring 事务管理方式及配置
  前段时间对Spring的事务配置做了比较深入的研究,在此之前对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
WindWant
2020/09/11
4560
spring 事务管理方式及配置
7000+字的Spring事务总结来啦!我饱了!
大家好,我是 Guide 哥,前段答应读者的 Spring 事务分析总结终于来了。这部分内容比较重要,不论是对于工作还是面试,但是网上比较好的参考资料比较少。
Guide哥
2020/05/15
7040
Spring-事务
事务的4个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabilily)。
lpe234
2021/03/02
5100
全面分析 Spring 的编程式事务管理及声明式事务管理
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务。通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之。 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解。您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等。本文将直接使用这些概念而不做详细解释。另外,您最好掌握数据库的基础知识,虽然这不是必须。 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带有 512M
java达人
2018/01/31
7280
常见的导致Spring事务失效的原因,以及传播行为PROPAGATION_REQUIRES_NEW的可能问题
PROPAGATION_REQUIRES_NEW是Spring事务传播行为的一种,表示需要一个新的事务来执行方法。如果当前已存在一个事务,那么该事务将被挂起,直到新的事务执行完毕。如果没有当前事务,那么就会创建一个新的事务来执行。PROPAGATION_REQUIRES_NEW确保了被注解的方法总是在一个新的事务中执行。
一凡sir
2023/11/08
6760
常见的导致Spring事务失效的原因,以及传播行为PROPAGATION_REQUIRES_NEW的可能问题
通过实际案例摸清楚Spring事务传播的行为
事务传播 对于Spring事务传播的七大行为,我们往往还停留在一些概念上,比如下面这张表: 定义 说明 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务,则加入到这个事务中。这是最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常。 PROPAGATION_REQUIRED_NEW 表示当前方法
智慧zhuhuix
2020/08/16
4030
Spring的事务管理
Spring有一个基于AOP之上的事务管理模块,这个模块能够帮助我们在逻辑层中很方便的控制数据库的事务。在此之前我们介绍了Spring对JDBC的模板支持 以及 面向切面的Spring,而且也用Spring的AOP编写了一个简单的切面类用于控制事务,在此对其中一些相同的东西就不再赘述了。所以本文是硬文,就让我们单刀直入地学习如何使用Spring的事务管理模块为我们管理事务吧。
端碗吹水
2020/09/23
6940
spring事务传播
在同一个类中,外部调用testTransactionWork,testTransactionWork无事务, insertTransaction有事务, 执行后记录还是插入成功,并没有因为insertTransaction抛出异常而回滚,事务没有生效.
leobhao
2022/06/28
7320
springboot本地事务
数据库事务的几个特性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是 ACID;
一个风轻云淡
2023/10/15
1670
Spring事务传播实现子事务的独立性
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利。
十毛
2019/07/15
1.1K0
Spring事务机制详解
Spring事务机制主要包括 声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考。
lyb-geek
2018/07/26
4500
相关推荐
Spring JDBC-Spring对事务管理的支持
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验