Spring事务类型及传播行为实战指南

Spring事务类型及传播行为实战指南

在Spring框架中,事务管理是确保数据一致性和完整性的关键部分。通过合理的事务管理,可以确保在数据库操作过程中的原子性、一致性、隔离性和持久性。本文将从Spring事务的基础概念、事务类型、传播行为以及实战案例等方面进行详细讲解。

一、Spring事务基础

1.1 事务概述

事务是一组数据库操作的逻辑单元,具有原子性、一致性、隔离性和持久性(ACID)四个特性。在Spring中,事务管理提供了一种可靠且灵活的方式来管理这些操作,确保数据的一致性和完整性。

  • 原子性(Atomicity):事务中的所有操作要么全部成功执行并提交,要么全部失败并回滚,保持数据的一致性。
  • 一致性(Consistency):事务的执行过程中,数据库从一个一致的状态转变为另一个一致的状态,不会破坏数据的完整性。
  • 隔离性(Isolation):多个并发事务之间应该相互隔离,每个事务的操作应该看起来像是在独立执行,避免数据冲突和不一致性。
  • 持久性(Durability):一旦事务提交,其对数据库的修改应该是永久性的,即使在系统故障或重启后也能够恢复。

1.2 事务管理器

事务管理器是Spring提供的一个接口,用于管理事务的开始、提交和回滚操作。它与底层的数据库或持久化框架进行交互,并确保事务的正确执行。Spring提供了多种事务管理器,如DataSourceTransactionManagerJpaTransactionManagerHibernateTransactionManagerJtaTransactionManager等,以适应不同的应用场景和开发需求。

1.3 事务定义和注解

事务定义(Transaction Definition)定义了事务的属性,如隔离级别、传播行为、超时设置等。在Spring中,事务定义可以通过编程方式或声明式方式来定义。声明式事务定义是通过在方法或类级别上使用注解或XML配置来定义事务的属性。Spring提供了@Transactional注解,用于在方法级别上定义事务的属性。

二、事务类型

Spring支持两种主要的事务管理方式:编程式事务管理和声明式事务管理。

2.1 编程式事务管理

编程式事务管理通过编写代码来显式地管理事务的开始、提交和回滚。这种方式提供了更高的灵活性,但代码量较大,容易出错。Spring提供了TransactionTemplate等工具类来简化编程式事务管理的实现。

2.2 声明式事务管理

声明式事务管理通过注解或XML配置来定义事务的边界和属性,无需在代码中显式地编写事务管理代码。这种方式使事务管理与业务逻辑分离,简化了代码,提高了可维护性。@Transactional注解是声明式事务管理中最常用的方式。

三、事务传播行为

事务传播行为(propagation behavior)指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行。Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。

3.1 REQUIRED

  • 行为描述:如果当前存在事务,则加入该事务中执行;如果当前没有事务,则创建一个新的事务执行。这是Spring默认的传播行为。
  • 应用场景:适用于大多数需要事务支持的方法,特别是当方法可能被其他事务方法调用时。

3.2 REQUIRES_NEW

  • 行为描述:总是创建一个新的事务,并挂起当前事务(如果存在)。在新的事务中执行方法,不受外部事务的影响。
  • 应用场景:适用于需要确保方法执行完全独立于外部事务的场景,例如,在嵌套事务中需要完全隔离的操作。

3.3 SUPPORTS

  • 行为描述:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务方式执行。
  • 应用场景:适用于那些对事务没有强制要求的方法,但在有事务存在时可以参与。

3.4 NOT_SUPPORTED

  • 行为描述:如果当前存在事务,就把当前事务挂起。以非事务方式执行方法。
  • 应用场景:适用于那些不需要事务支持的操作,例如,读取数据但不修改数据的操作。

3.5 MANDATORY

  • 行为描述:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
  • 应用场景:适用于那些必须在事务中执行的方法,确保操作的原子性和一致性。

3.6 NEVER

  • 行为描述:以非事务方式执行方法,如果当前存在事务,则抛出异常。
  • 应用场景:适用于那些绝对不能在事务中执行的操作,确保操作的独立性。

3.7 NESTED

  • 行为描述:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就创建一个新事务。
  • 应用场景:适用于需要在当前事务内部执行一个具有部分回滚能力的子事务的场景。

四、实战案例

4.1 场景描述

假设有一个电商系统,其中包括用户购买商品的操作。购买操作涉及到多个数据库操作,如库存减少、用户余额减少等,这些操作需要在一个事务中完成,以确保数据的一致性。

4.2 实现步骤

  1. 定义服务层接口和实现

    定义一个BookShopService接口和它的实现类BookShopServiceImpl,用于处理购买商品的业务逻辑。

    public interface BookShopService {void purchase(String username, String isbn);
    }@Service
    @Transactional(propagation = Propagation.REQUIRED)
    public class BookShopServiceImpl implements BookShopService {@Autowiredprivate BookShopDao bookShopDao;@Overridepublic void purchase(String username, String isbn) {// 1. 获取书的单价int price = bookShopDao.findBookPriceByIsbn(isbn);// 2. 更新书的库存bookShopDao.updateBookStock(isbn);// 3. 更新用户的余额bookShopDao.updateUserAccount(username, price);}
    }
    

    注意,在BookShopServiceImpl类上使用了@Transactional注解,并指定了传播行为为REQUIRED。这意味着如果当前存在事务,则购买操作将加入该事务;如果当前没有事务,则创建一个新的事务。

  2. 调用服务层方法

    在需要购买商品的地方,直接调用BookShopServicepurchase方法即可。

    @Autowired
    private BookShopService bookShopService;public void checkout(String username, List<String> isbns) {for (String isbn : isbns) {bookShopService.purchase(username, isbn);}
    }
    

    由于purchase方法已经通过@Transactional注解声明了事务,因此在checkout方法中调用purchase方法时,所有的购买操作将在一个事务中完成,确保数据的一致性。

4.3 隔离级别和错误处理

在实际应用中,还需要根据业务需求设置合适的隔离级别,并在发生错误时进行适当的错误处理和事务回滚。

  • 设置隔离级别:可以通过@Transactional注解的isolation属性来设置隔离级别。
  • 错误处理:在purchase方法中,如果发生异常,Spring将自动回滚事务,确保数据的一致性。

五、总结

Spring事务管理提供了可靠且灵活的方式来管理数据库操作中的事务,确保数据的一致性和完整性。通过合理使用事务类型和传播行为,可以灵活地控制事务的边界和行为,满足各种业务需求。在实际开发中,应根据具体业务场景选择合适的事务管理方式,并合理设置事务属性和隔离级别,以确保系统的稳定性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149902.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【全新课程】正点原子《ESP32物联网项目实战》培训课程上线!

正点原子《ESP32物联网项目实战》全新培训课程上线啦&#xff01;正点原子工程师手把手教你学&#xff01;通过多个项目实战&#xff0c;掌握ESP32物联网项目的开发&#xff01; 一、课程介绍 本课程围绕物联网实战项目展开教学&#xff0c;内容循序渐进&#xff0c;涵盖了环…

人工智能在医疗健康领域的应用与展望

随着技术的发展&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;正逐渐渗透到各行各业之中&#xff0c;其中医疗健康领域因其对人类福祉的重要性而备受关注。AI技术的应用不仅能够提高医疗服务的质量和效率&#xff0c;还能促进医学研究的进步&#x…

<刷题笔记> 二叉搜索树与双向链表注意事项

二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com) 根据题意&#xff0c;我们需要将搜索二叉树转换成有序的形式。 重点一&#xff1a;BST的中序遍历一定是有序的 因此&#xff0c;此题无论如何都需要使用中序。 又因为要求原地算法&#xff0c;所以&#xff1a; 重点二&a…

ChatGPT 提取文档内容,高效制作PPT、论文

随着人工智能生成内容&#xff08;AIGC&#xff09;的快速发展&#xff0c;利用先进的技术工具如 ChatGPT 的 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;模式&#xff0c;可以显著提升文档内容提取和内容创作的效率。以下将详细介绍如…

Windows内核编程基础(1)

在前面的文章中&#xff0c;介绍了如何配置开发环境以及如何进行调试。 接下来的几篇文章&#xff0c;将会重点介绍内核编程中所需要了解的一些理论基础。 我写这个系列文章的主要目的是方便以后自己查阅&#xff0c;同时也给正在学习内核开发的小伙伴一些参考&#xff0c;所…

seaCMS v12.9代码审计学习(上半)

文章目录 CMS介绍环境搭建代码总览漏洞复现/js/player/dmplayer/player/index.php 反射性xss(详见https://github.com/HuaQiPro/seacms/issues/28)admin_ping.php 代码执行漏洞太多了&#xff0c;整理完了下半部分一次性写完 CMS介绍 海洋cms是一款经典的开源影视建站系统&…

召回05 矩阵补充、最近邻查找

matrix completion 上述矩阵补充模型&#xff1a; 基于embadding做推荐&#xff0c;输入用户和物品id&#xff0c;输出一个实数&#xff0c;即用户对物品兴趣的预估值。把id映射到一个向量a,是对用户的表征&#xff0c;embadding层是一个矩阵&#xff0c;a是矩阵的一列&#x…

Dify部署及初步测试

文章目录 Dify安装Dify启动模型接入模型测试 Dify安装 根据Docker Compose 部署中的相关指引&#xff0c;完成以下步骤 git clone https://github.com/langgenius/dify.git cd dify/docker cp .env.example .env docker compose up -d查看容器状态&#xff1a;docker compose…

408选择题笔记|自用|随笔记录

文章目录 B树&#xff1a;访问节点建堆&#xff01;将结点插入空堆广义指令求每个子网可容纳的主机数量虚拟内存的实现方式文件目录项FCB和文件安全性管理级别索引文件三种存取方式及适用器件成组分解访问磁盘次数 C语言标识符 最小帧长物理传输层介质 局域网&广域网考点总…

【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!

正点原子《ESP32物联网项目实战》全新培训课程上线啦&#xff01;正点原子工程师手把手教你学&#xff01;彻底解决ARM32单片机项目入门难的问题&#xff01; 一、课程介绍 本课程专为ARM32单片机的入门学习者设计&#xff0c;涵盖了环境搭建、编程软件使用、模块基础驱动和多…

Vue3 + ElementPlus 的后台菜单指引

文章目录 需求实现思路 需求 实现思路 引导页用 Drive.js 基本的使用操作这里写了一些菜单使用 ElementPlus 的组件&#xff0c;可以调用组件中暴露的这个方法&#xff0c;具体使用方法在这里说明 二者结合一下&#xff0c;就可以有这样的效果了

10.软件工程知识详解上

软件工程概述 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过程&#xff0c;任务是确定软件开发工程必须完成的总目标&#xff0c;具体可分成问题定义、可行性研究、需求分析等。软件开发时期&#xff1a;就是软件的设计与实现&#xff0c;可分成…

MySQL—触发器详解

基本介绍 触发器是与表有关的数据库对象&#xff0c;在 INSERT、UPDATE、DELETE 操作之前或之后触发并执行触发器中定义的 SQL 语句。 触发器的这种特性可以协助应用在数据库端确保数据的完整性、日志记录、数据校验等操作。 使用别名 NEW 和 OLD 来引用触发器中发生变化的记…

水电站/水库大坝安全监测系统完整解决方案

一、背景 在当今社会&#xff0c;随着全球对清洁能源需求的日益增长&#xff0c;水电站作为可再生能源的重要组成部分&#xff0c;其安全稳定运行显得尤为重要。水电站&#xff0c;尤其是大型水库大坝&#xff0c;不仅承载着发电、防洪、灌溉等多重功能&#xff0c;还直接关系…

后端回写前端日期格式化

问题 不进行格式化处理&#xff0c;就会导致传递的字符串很奇怪 解决方案 注解&#xff08;字段&#xff09; <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</…

pandas外文文档快速入门

pandas资源可以在github中进行查询 特点&#xff1a; 1、基于numpy库进行开发 2、主要处理一维、二维的数据 3、可以处理sql&#xff0c;execl&#xff0c;时间表等复杂数据结构 导言 创建一维、二维表 创建的表格其实会和二维表很像 假设我们存储一些数据 其中&#xf…

2024年流动式起重机司机证考试题库及流动式起重机司机试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证考试题库及流动式起重机司机试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试…

单周涨粉过万,这3种AI绘画风格也太火了!

今天给大家分享小红书平台的一些爆款AI绘画类型&#xff0c;如果想要通过AI绘画赚钱或者想要快速起号一定要看&#xff01; 当然&#xff0c;除了小红书平台也可以发一些到其他自媒体平台上&#xff0c;变现方式有很多&#xff0c;可以开店铺卖壁纸、提示词、头像、接定制、合…

Linux centerOS 服务器搭建NTP服务

1&#xff0c;安装 NTP软件 sudo yum -y install ntp2&#xff0c;编辑配置文件 sudo vim /etc/ntp.conf 3&#xff0c;修改配置 在ntp.conf文件中&#xff0c;可以配置服务器从哪些上游时间源同步时间。如果你想让你的服务器对外同步时间&#xff0c;可以去掉restrict d…

蓝象智联与高德签署战略合作,共创时空“数聚港”

9月20日&#xff0c;高德地图副总裁兼高德云图总经理董振宁一行莅临蓝象智联杭州总部进行座谈交流。蓝象智联董事长童玲、CEO徐敏以及合伙人兼算法科学家毛仁歆给予热情接待。在双方的共同见证下&#xff0c;蓝象智联与高德云图签署战略合作协议&#xff0c;标志着双方在数据流…