Spring声明式事务使用详情(知识点+案例)

news2024/9/22 17:18:32

目录

1、声明式事务的概念

2、Spring事务管理器

3、基于注解的Spring事务

4、Spring事务属性

4.1只读(Read-Only)

4.2事务超时(Timeout)

4.3事务异常回滚(rollbackFor)

4.4事务隔离级别(Isolation Level)

4.5事务的传播行为(Propagation)

在数据库操作中,事务是一组操作的集合,要么全部成功,要么全部失败。事务管理的目标是确保数据一致性和完整性。Spring 提供了强大的事务管理功能,简化了事务处理的复杂性。

1、声明式事务的概念

事务主要分为两类,一类是编程式事务,一类是声明式事务

编程式事务是指手动编写程序来管理事务,即通过编写代码的方式直接控制事务的提交和回滚。

比如下面的例子

Connection conn = ...;
  
try {
    // 开启事务:关闭事务的自动提交
    conn.setAutoCommit(false);
    // 核心操作
    // 业务代码
    // 提交事务
    conn.commit();
  
}catch(Exception e){
  
    // 回滚事务
    conn.rollBack();
  
}finally{
  
    // 释放数据库连接
    conn.close();
  
}

编程式事务具体操作过程中,所有细节都需要程序员自己来完成,比较繁琐,且代码复用性不高。

声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚

开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作!

使用声明式事务可以将事务的控制和业务逻辑分离开来,提高代码的可读性和可维护性。

2、Spring事务管理器

在Spring框架中,事务管理器(Transaction Manager)是一个核心组件,它负责管理和控制事务的边界,确保数据的一致性和完整性。Spring提供了多种事务管理器,用于不同的事务处理场景和技术栈。

事务管理器的主要职责包括:

  • 管理事务的边界:确定事务的开始和结束,以及事务的提交或回滚。
  • 集成事务资源:如数据源、消息队列等,确保这些资源能够参与到事务中来。
  • 控制事务的传播行为:在复杂的事务调用场景中,控制事务的传播行为,如是否需要在现有事务中运行、是否需要创建新事务等。
  • 管理事务的隔离级别:设置事务的隔离级别,以防止并发事务之间的干扰。
  • 处理异常和回滚:在事务执行过程中,如果遇到异常,则根据事务的属性决定是否需要回滚事务。

Spring为不同的持久化技术提供了不同的事务管理器实现类,如:

  • DataSourceTransactionManager:用于JDBC和MyBatis等基于JDBC的持久化技术。
  • JpaTransactionManager:用于JPA(Java Persistence API)的持久化技术。
  • HibernateTransactionManager:专门用于Hibernate的持久化技术。
  • JmsTransactionManager:用于JMS(Java Message Service)消息队列的事务管理。

我们现在要使用的事务管理器是DataSourceTransactionManager,将来整合 JDBC方式、JdbcTemplate方式、Mybatis方式的事务实现!

DataSourceTransactionManager类中的主要方法:

  • doBegin():开启事务
  • doSuspend():挂起事务
  • doResume():恢复挂起的事务
  • doCommit():提交事务
  • doRollback():回滚事务

3、基于注解的Spring事务

入门案例

第一步:导入依赖

Spring声明式事务对应依赖
    - spring-tx: 包含声明式事务实现的基本规范(事务管理器规范接口和事务增强等等)
    - spring-jdbc: 包含DataSource方式事务管理器实现类DataSourceTransactionManager
    - spring-orm: 包含其他持久层框架的事务管理器实现类例如:Hibernate/Jpa等

<!-- 数据库驱动 和 连接池-->
  <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.25</version>
  </dependency>

  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.8</version>
  </dependency>

  <!-- spring-jdbc -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>6.0.6</version>
  </dependency>

  <!-- 声明式事务依赖-->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>6.0.6</version>
  </dependency>

第二步:配置事务管理器

配置要声明事务的数据库

第三步:使用声明事务注解@Transactional

第四步:调用

4、Spring事务属性

4.1只读(Read-Only

对一个查询操作来说,如果我们把它设置成只读,就能够明确告诉数据库,这个操作不涉及写操作。这样数据库就能够针对查询操作来进行优化。

设置方式

// readOnly = true把当前事务设置为只读 默认是false!
@Transactional(readOnly = true)

把事务设置成已读的话,接下来就只能进行数据库查询语句,不能进行数据库增删改。

补充:@Transactional注解放在类上,则事务会影响到类中的每一个方法。除非在方法上又设置了 @Transactional 注解。对一个方法来说,离它最近的 @Transactional 注解中的事务属性设置生效。

4.2事务超时(Timeout)

 事务在执行过程中,有可能因为遇到某些问题,导致程序卡住,从而长时间占用数据库资源。而长时间占用资源,大概率是因为程序运行出现了问题(可能是Java程序或MySQL数据库或网络连接等等)。此时这个很可能出问题的程序应该被回滚,撤销它已做的操作,事务结束,把资源让出来,让其他正常程序可以执行。概括来说就是一句话:超时回滚,释放资源。

timeout设置事务超时时间,单位秒! 默认: -1 永不超时,不限制事务时间!

4.3事务异常回滚(rollbackFor)

默认只针对运行时异常回滚,编译时异常不回滚

我们可以设置事务所有异常回滚,rollbackFor =Exception.class

rollbackFor属性:指定哪些异常类才会回滚,默认是 RuntimeException and Error 异常方可回滚!

/**
 * timeout设置事务超时时间,单位秒! 默认: -1 永不超时,不限制事务时间!
 * rollbackFor = 指定哪些异常才会回滚,默认是 RuntimeException and Error 异常方可回滚!
 * noRollbackFor = 指定哪些异常不会回滚, 默认没有指定,如果指定,应该在rollbackFor的范围内!
 */
@Transactional(readOnly = false,timeout = 3,rollbackFor = Exception.class)
public void changeInfo() throws FileNotFoundException {
    studentDao.updateAgeById(100,1);
    //主动抛出一个检查异常,测试! 发现不会回滚,因为不在rollbackFor的默认范围内! 
    new FileInputStream("xxxx");
    studentDao.updateNameById("test1",1);
}
4.4事务隔离级别(Isolation Level)

    数据库事务的隔离级别是指在多个事务并发执行时,数据库系统为了保证数据一致性所遵循的规定。常见的隔离级别包括:

  •     读未提交(Read Uncommitted):事务可以读取未被提交的数据,容易产生脏读、不可重复读和幻读等问题。实现简单但不太安全,一般不用。
  •     读已提交(Read Committed):事务只能读取已经提交的数据,可以避免脏读问题,但可能引发不可重复读和幻读。
  •     可重复读(Repeatable Read):在一个事务中,相同的查询将返回相同的结果集,不管其他事务对数据做了什么修改。可以避免脏读和不可重复读,但仍有幻读的问题。
  •     串行化(Serializable):最高的隔离级别,完全禁止了并发,只允许一个事务执行完毕之后才能执行另一个事务。可以避免以上所有问题,但效率较低,不适用于高并发场景。

    不同的隔离级别适用于不同的场景,需要根据实际业务需求进行选择和调整。

4.5事务的传播行为(Propagation)

在 Spring 事务管理中,事务的传播行为(Transaction Propagation)定义了一个事务方法被另一个事务方法调用时,事务如何传播。

我们通过propagation属性去设置它的传播

事务传播propagation的默认值是REQUIRED

REQUIRED:如果父方法有事务,就加入,如果没有就新建自己独立!(就是说,如果父方法下调用的其他事务,如果其他事务异常回滚了,我也要跟着回滚,这是一个整体)

REQUIRES_NEW:不管父方法是否有事务,我都新建事务,都是独立的(如果父方法下调用的其他事务,如果其他事务异常回滚了,我们不用跟着回滚,我们是独立执行的)

注意:在同一个类中,对于@Transactional注解的方法调用,事务传播行为不会生效。这是因为Spring框架中使用代理模式实现了事务机制,在同一个类中的方法调用并不经过代理,而是通过对象的方法调用,因此@Transactional注解的设置不会被代理捕获,也就不会产生任何事务传播行为的效果

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

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

相关文章

如何用Java SpringBoot打造助农捐赠平台?2025年25届毕业生必看+最新设计实现攻略!

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【深度学习与NLP】——词嵌入Embedding技术

目录 1.词嵌入的作用 2.嵌入矩阵的计算 3.Embedding层的代码实验 词嵌入&#xff08;Embedding&#xff09;技术是一种将词汇映射到低维连续向量空间的方法。将离散的单词数据处理成连续且固定长度的向量&#xff0c;使模型可以学习和处理语义信息。 假设需要将["Are&…

终于有人把数据中台讲明白了

在大数据发展的黄金期&#xff0c;几乎所有的高科技企业都在思考一个问题&#xff1a;海量数据作为大多数企业发展不可避免的一个趋势之后&#xff0c;企业该怎么去应用这部分数据资产&#xff0c;会对其商业产生什么影响&#xff0c;如何使数据对企业产生正面的推动而不是成为…

【Oracle APEX开发小技巧 7】解决初始化数据在动态操作-变更中被识别跳出弹窗的问题

在开发时有一个场景——推送开关数据来自于初始化动态操作&#xff0c;理论上只有变更的时候才会有二次提示&#xff0c;但是因为初始化会触发变更&#xff0c;所以会有弹窗&#xff0c;这不是我们想要的结果&#xff0c;有什么办法在初次回显数据不跳出提示吗&#xff1f;​​…

day-48 分割回文串

思路 利用dfs算法&#xff0c;用ids表示当前所指向字符的位置&#xff0c;依次判断s.charAt(ids),s.charAt(ids)s.charAt(ids1)…是否为回文字符串&#xff0c;如果是则加入链表p,再递归调用dfs函数 解题过程 每次调用dfs函数后记得还原现场 Code class Solution {public St…

【STM32+HAL库】---- 基础定时器中断控制LED

硬件开发板&#xff1a;STM32G0B1RET6 软件平台&#xff1a;cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置LED LED由PA5引脚控制&#xff0c;选择PA5引脚&#xff0c;选择GPIO_Output模式 1.3 定时时间的计算 T ( 预分频系数 1 ) ( 重装载值 1 ) 时…

RedisStack十部曲之二:Redis的核心概念

文章目录 键空间修改和查询键键过期遍历键空间 客户端缓存在计算机科学中有两个难题客户端缓存的Redis实现跟踪模式的工作机制统一的键命名空间 两种连接方式缓存策略Opt-in 模式Opt-out 模式广播模式NOLOOP选项避免竟态条件当与服务器失去连接怎么办什么值得缓存 流水线请求/响…

【2024 CCF编程能力等级认证(GESP)C++ 】 计算机基础知识

目录 1. 引言2. 计算机系统结构2.1 中央处理器&#xff08;CPU - Central Processing Unit&#xff09;2.1.1 运算器 2.1.2 控制器2.1.3 性能指标2.2 存储器2.3 输入设备2.4 输出设备 3. 计算机系统层次结构4. 操作系统4.1 操作系统分类4.2 操作系统常见操作4.2.1 基本开关机操…

SpringBoot实现文件内容对比

背景 在上一篇博客中&#xff0c;我实践了WORD转换成PDF/TXT的实现方式&#xff0c;本周接到一个新的需求&#xff0c;恰好就用上了这个成果。需求如下&#xff1a;客户提供一个WORD范本给用户&#xff0c;用户范本进行修改后&#xff0c;再反馈给客户。反馈的成果多种多样&…

RocketMQ消息回溯实践与解析

文章目录 1 问题背景2 验证2.1 生产者启动2.2 消费者启动2.3 执行回溯2.4 结果验证2.5 验证小结2.5.1 分析参数2.5.2 思考 3 分析3.1 策略模式&#xff0c;解析命令行3.2 创建客户端&#xff0c;与服务端交互3.3 获取topic对应的broker地址&#xff0c;提交重置请求3.4 与 name…

TCP 拥塞控制

概念详解 TCP拥塞控制是网络通信中的一个关键机制&#xff0c;它通过动态调整发送数据的速率来避免网络拥塞。以下是TCP拥塞控制的详细概念解释&#xff1a; 拥塞窗口&#xff08;CWND, Congestion Window&#xff09;: 定义&#xff1a;发送方在收到接收方的确认&#xff08;…

华为网络工程师证书等级有哪些?怎么备考?

华为网络工程师是由华为技术厂商推出的一系列网络工程师认证&#xff0c;其主要目的就是为了培养了验证网络工程师在华为技术以及解决方案方面的拥有一定的专业知识及技能&#xff0c;该证书分为多个等级&#xff0c;涵盖了不同网络领域及技术&#xff0c;也为众多的网络工程师…

SqlServer: 安装或升级到SqlServer2022

一、下载安装包。 https://info.microsoft.com/ww-landing-sql-server-2022.html?lcidzh-CN 简单注册一下之后&#xff0c;就可以下载安装包了。 或者在我的资源中下载&#xff1a; https://download.csdn.net/download/yenange/89709660 系统要求&#xff1a; https://…

暴力破解和撞库攻击有什么区别,怎么防御暴力破解和撞库攻击

在网络世界中&#xff0c;我们的账户安全时刻面临着各种威胁。其中&#xff0c;暴力破解和撞库攻击就是常见的两种危险手段。今天&#xff0c;就让我们深入了解这两种攻击方式的含义&#xff0c;并学习如何有效地进行防护。 暴力破解的含义 暴力破解&#xff0c;就如同一个不…

java【day03】---(Vue-Element)

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xf…

星闪NearLink短距无线连接技术

星闪NearLink短距无线连接技术&#xff0c;作为华为主导的新一代无线短距通信标准技术&#xff0c;自2020年起由中国工信部牵头制定标准&#xff0c;旨在为万物互联时代提供更高效、更稳定的连接方式。 类似技术介绍 AirDrop&#xff08;苹果&#xff09; AirDrop是苹果公司开发…

Apifox使用学习

Apifox是API文档、API调试、API Mock、API自动测试一体化协作平台&#xff0c;定位SwaggerPostmanMockJMeter。 只需要定义好API文档&#xff0c;API调试、API数据Mock、API自动化测试就可以直接使用。 API文档和API开发测试使用同一个工具&#xff0c;API调试完成后即可保证…

PPT图表制作不再难!这款在线PPT软件让办公更简单!

ppt图表怎么制作&#xff1f; 在当下注重视觉呈现的数字化时代&#xff0c;有效的信息传递和数据可视化变得越来越重要。不管是商业演示、学术报告还是项目汇报&#xff0c;一份精心制作的PPT演示文稿&#xff0c;往往能够起到事半功倍的效果。其中&#xff0c;图表作为PPT中不…

n*n矩阵,输出矩阵中任意两点之间所有路径

题目1&#xff1a;给你一个正整数n&#xff0c; 构造一个n*n的四项链表矩阵。 要求&#xff1a; 1.使用四项链表 2.矩阵从左到右&#xff0c;从上到下值依次为1,2,3,4,......n*n 题目2&#xff1a;基于题目1&#xff0c; 在n*n链表矩阵中&#xff0c;输出矩阵中任意两点之间所有…

5款文案自动生成器,高质量创意文案一键为你生成

在当今竞争激烈的内容创作领域&#xff0c;每一个字、每一句话都承载着巨大的价值。对于创作者而言&#xff0c;文案自动生成器的出现&#xff0c;犹如在茫茫大海中点亮了一座指引方向的灯塔。它们不仅为创作者节省了宝贵的时间和精力&#xff0c;更像是一把神奇的钥匙&#xf…