Spring (十)事务

目录

一 Spring数据库的相关配置:

1 导入包:

2 配置数据库连接信息

3 可以直接使用:DataSource,JdbcTemplate

二 事务管理:

1 事务管理的实现

1.1 开启Spring事务管理

1.2 为指定方法添加事务

2 关键类与接口

2.1 事务拦截器(TransactionInterceptor)

2.2 事务管理器(PlatformTransactionManager)

3 属性

3.1 timeout 超时限制

3.2. readOnly 只读优化

3.3 rollbackFor 回滚指明

3.4 norollbackFor不回滚指明

3.5 propagation 事务的传播行为

3.6 小事务如果与大事务共用一个事务,那小事务按照大事务的属性设置,小事务的失效

三 内容补充

eg:具体使用举例


一 Spring数据库的相关配置:

1 导入包:

2 配置数据库连接信息

3 可以直接使用:DataSource,JdbcTemplate

二 事务管理:

1 声明式

声明式VS编程式

声明式:通过注解等方式,告诉框架,我需要做什么,框架会帮我做什么。

优点:代码量少

缺点:封装太多,排错不容易。

编程式:通过代码的方式,告诉框架,我要做什么,需要自己写代码实现。

优点:排错容易

缺点:代码量多

1 事务管理的实现

1.1 开启Spring事务管理
//开启事务
@EnableTransactionManagement
@SpringBootApplication
public class Spring03Application {public static void main(String[] args) {SpringApplication.run(Spring03Application.class, args);}}
1.2 为指定方法添加事务

2 关键类与接口

类/接口作用
PlatformTransactionManager事务操作的核心接口(提交、回滚等)。
TransactionInterceptor拦截方法调用,管理事务边界。(切面)
TransactionAttributeSource解析@Transactional的属性。
BeanFactoryTransactionAttributeSourceAdvisor将事务通知应用到目标方法。
InfrastructureAdvisorAutoProxyCreator自动生成代理对象的Bean后处理器。
2.1 事务拦截器(TransactionInterceptor)
  • 拦截逻辑:代理对象会将方法调用委托给TransactionInterceptor(事务拦截器),该拦截器负责管理事务的开启、提交或回滚。

  • 事务属性解析:拦截器会解析@Transactional注解的属性(如propagationisolationrollbackFor等),决定事务的行为。

2.2 事务管理器(PlatformTransactionManager)
  • 事务操作:拦截器通过PlatformTransactionManager接口(如DataSourceTransactionManagerJpaTransactionManager)执行具体的事务操作:

    • getTransaction():根据传播行为决定是否创建新事务或加入现有事务。

    • commit():提交事务(如果当前是事务的发起者)。

    • rollback():回滚事务(在抛出异常时触发)。

3 属性

3.1 timeout 超时限制

(timeoutString也行)超时时间,事务超时,以秒为单位,一旦超过约定时间,事务就会回滚。

超时时间指的是从方法开始,到最后一次数据库操作的时间。

@Transactional(timeout = 10) // 单位:秒
public void doBusinessOperation() {// 业务逻辑
}

以下的sleep将不会计入超时时间的范畴

3.2. readOnly 只读优化

性能优化:通过声明只读事务提示底层资源进行优化,适用于纯查询场景。

合理使用readOnly=true可以提升查询性能,但需结合具体技术栈验证其行为。

@Transactional(readOnly = true) // 默认为false
public List<User> findAllUsers() {// 查询逻辑(不应包含INSERT/UPDATE/DELETE)
}
3.3 rollbackFor 回滚指明

通过rollbackFor自定义事务回滚的异常条件,覆盖默认行为。

  • 精确控制回滚条件:允许开发者明确指定某些特定异常(包括受检异常)触发事务回滚。

  • 覆盖默认行为:默认仅回滚未检查异常,通过rollbackFor可扩展或替换默认规则。

异常类型示例默认是否触发回滚说明
运行时异常(Unchecked)RuntimeExceptionNullPointerExceptionIllegalArgumentException继承自RuntimeException
错误(Error)OutOfMemoryErrorStackOverflowError继承自Error
编译时异常(Checked)IOExceptionSQLException继承自Exception(非RuntimeException)

由此我们使用回滚指明rollbackfor来调控回滚的时机

3.4 norollbackFor不回滚指明
  • 核心作用:通过noRollbackFor精准控制哪些异常不触发事务回滚,即使它们是默认回滚类型。

  • 适用场景

    • 需要忽略特定的非致命异常(如业务警告、预期内的错误)。

    • 覆盖框架或默认的异常回滚策略。

  • 关键原则

    • 明确异常类型,避免过度使用(如直接排除Exception.class可能导致数据不一致)。

    • 结合rollbackFor实现精细化的事务控制。

    • noRollbackFor优先级高于rollbackFor

3.5 propagation 事务的传播行为

传播行为类型及作用(小事务与大事务的绑定关系)

传播行为描述适用场景
REQUIRED(默认)如果当前存在事务,则加入该事务;否则新建一个事务。多数业务场景(如订单创建、库存扣减)。
SUPPORTS如果当前存在事务,则加入;否则以非事务方式运行。查询方法,允许在事务或非事务上下文中执行。
MANDATORY必须在已有事务中运行,否则抛出异常。强制要求调用方必须开启事务(如核心业务操作)。
REQUIRES_NEW无论当前是否存在事务,都新建一个独立事务,挂起当前事务(若存在)。需要独立提交的操作(如日志记录、异步任务)。
NOT_SUPPORTED以非事务方式执行,若当前存在事务,则挂起当前事务。不依赖事务的操作(如纯查询或外部接口调用)。
NEVER必须在非事务环境下执行,否则抛出异常。严格禁止事务的场合(如某些性能敏感操作)。

NESTED(保存点

:存档)

在已有事务中嵌套一个子事务(通过保存点实现),子事务可独立回滚。部分操作需要独立回滚(如批量处理中的单条失败)。仅部分数据库支持(如MySQL的InnoDB)。

3.6 小事务如果与大事务共用一个事务,那小事务按照大事务的属性设置,小事务的失效

1 传播行为
若小事务的传播行为为REQUIRED(默认),当它被大事务调用时,会直接加入大事务,而非创建新事务。

@Transactional(timeout = 30)  // 大事务
public void bigTransaction() {smallTransaction();  // 小事务
}@Transactional(timeout = 10)  // 小事务(实际无效)
public void smallTransaction() {// 操作数据库
}

2. 小事务“失效”的具体表现

事务属性失效原因
超时(Timeout)大事务的timeout决定了整个事务的最长执行时间,小事务的timeout设置无效。
隔离级别(Isolation)事务的隔离级别在事务开始时确定,小事务无法修改已存在事务的隔离级别。
只读(ReadOnly)若大事务为读写模式,小事务的readOnly=true不生效(数据库连接仍为读写模式)。

三 内容补充

eg:实现方法

下面这种情况金额减了但是库存没有减,扣减金额跟随大事务,扣减库存开启自己的事务自己干

eg:具体使用举例

1 如果在上述位置放置运行时异常,那么根据分析:

C  I  J D K L F  H  N - 都是好的可以正常运行

2 如果在 L方法位置放置运行时异常,那么根据分析:

F  H  C  I J  K   都是好的可以正常  ( E这一段代码执行不到 )

3 如果在 M方法位置放置运行时异常,那么根据分析:

F  H  C  I  J  D  K   L 都是好的可以正常运行

1. REQUIRED(默认)

比喻场景团队合作做项目

  • 行为

    • 如果你加入时已经有团队在做项目(存在事务),你就直接跟着团队一起干(加入事务)。

    • 如果没人开始做(无事务),你就自己拉起一个团队(新建事务)。

  • 总结能跟团就跟团,没团就自己组队


2. SUPPORTS

比喻场景朋友聚餐AA制

  • 行为

    • 如果大家决定AA制(存在事务),你就跟着一起AA(加入事务)。

    • 如果没人提AA(无事务),你就自己单独付钱(非事务运行)。

  • 总结有团就随大流,没团就自己玩


3. MANDATORY

比喻场景必须团队合作的任务

  • 行为

    • 必须有人组队(存在事务)才能执行任务,否则直接罢工(抛出异常)。

    • 比如公司规定某些任务必须集体完成,不允许单干。

  • 总结没团队就罢工


4. REQUIRES_NEW

比喻场景临时插队的紧急任务

  • 行为

    • 无论你手头有没有任务(无论是否存在事务),都要暂停当前工作(挂起事务),先处理这个紧急任务(新建独立事务)。

    • 例如:正在写报告时,老板突然让你立刻发一封邮件(独立事务),发完邮件再继续写报告。

  • 总结天大的事也得先干我这个


5. NOT_SUPPORTED

比喻场景去图书馆自习

  • 行为

    • 你不想被其他人的讨论影响(挂起当前事务),选择自己安静看书(非事务运行)。

    • 例如:在团队开会时(存在事务),你突然去走廊接电话(非事务)。

  • 总结谁都别打扰我,我要自己静静


6. NEVER

比喻场景严禁团队合作的考试

  • 行为

    • 必须独自完成考试(非事务),如果发现有人组队作弊(存在事务),直接取消资格(抛出异常)。

  • 总结敢组队就挂科


7. NESTED

比喻场景项目中的子任务

  • 行为

    • 你在做一个大项目(外层事务),中途画了一部分设计稿(创建保存点)。

    • 如果设计稿有问题(子事务失败),可以只重画这部分(回滚到保存点),而不用推翻整个项目。

  • 总结大项目里的小草稿,错了只改这一页

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)

文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…

Java算术运算符与算术表达式

Java算术运算符包括&#xff08;加、正号&#xff09;、-&#xff08;减、负号&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#xff09;、%&#xff08;求余&#xff09;、&#xff08;自增&#xff09;和--&#xff08;自减&#xff09;。它们用于构建算术表…

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通过Cookie/Session扩展状态管理)。基于TCP:默认端口80(HTTP)、443(HTTPS),保证可靠传输。请…

Linux 网络:skb 数据管理

文章目录 1. 前言2. skb 数据管理2.1 初始化2.2 数据的插入2.2.1 在头部插入数据2.2.2 在尾部插入数据 2.2 数据的移除 3. 小结 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. skb 数据管理 数…

考研数学复习之定积分定义求解数列极限(超详细教程)

定积分定义求解数列极限是一种将数列极限问题转化为定积分问题进行求解的方法。这种方法通常适用于那些和式数列极限,其主要思路是将数列的项看作是某个函数在某一点或某一段区间上的取值或某种形式的和,然后利用定积分的性质和计算方法,来求解这类数列的极限。 定积分定义 设函…

Linux-基础开发工具

1.软件包管理器 1.1什么是软件包 • 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序. • 但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上, 通过包管理器可以很…

【无人机路径规划】基于麻雀搜索算法(SSA)的无人机路径规划(Matlab)

效果一览 代码获取私信博主基于麻雀搜索算法&#xff08;SSA&#xff09;的无人机路径规划&#xff08;Matlab&#xff09; 一、算法背景与核心思想 麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种受麻雀群体觅食行为启发的元启发式算法&#xff0…

Redis未授权访问

一&#xff0c;Redis未授权访问 Redis默认配置存在以下安全隐患&#xff0c;导致未授权访问漏洞&#xff1a; 无认证机制&#xff1a;默认未启用密码认证&#xff08;requirepass为空&#xff09;&#xff0c;允许任意用户连接。网络暴露&#xff1a;默认绑定所有接口&#xff…

Flutter 基础组件 Text 详解

目录 1. 引言 2. 基本使用 3. 自定义样式 4. 文本对齐与溢出控制 5. 外边距 5.1 使用 Container 包裹 5.2 使用 Padding 组件 5.3 在 Row/Column 中使用 5.4 动态边距调整 5.5 关键区别说明 5.6 设置 margin 无效 6. 结论 相关推荐 1. 引言 Text 组件是 Flutter 中…

数据库系统概论(二)数据模型

数据库系统概论&#xff08;二&#xff09;数据模型 数据库系统概论&#xff08;二&#xff09;数据模型前言一、数据建模二、概念模型三、数据模型的三要素四、层次模型五、网状模型六、关系模型 总结&#xff08;核心概念速记&#xff09;&#xff1a; 数据库系统概论&#x…

Git基本概念及使用

目录 一、git安装 二、git仓库基本概念 1. 远程仓库&#xff08;Remote&#xff09;&#xff1a; 2. 本地库&#xff08;Repository&#xff09;&#xff1a; 3. 分支&#xff08;Branch&#xff09;&#xff1a; 4.本地库和远程库的关系 三、git仓库的工作流程 四、gi…

详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本

nbconvert 是 Jupyter 提供的一个非常强大的工具&#xff0c;允许用户将 Jupyter Notebook 文件&#xff08;.ipynb&#xff09;转换成多种格式&#xff0c;包括 Python 脚本&#xff08;.py&#xff09;、HTML、PDF、LaTeX 等。你可以通过命令行来运行 nbconvert&#xff0c;也…

⭐算法OJ⭐链表排序【归并排序】(C++/JavaScript 实现)

文章目录 148. Sort List解题思路归并排序的基本思想归并排序的步骤 实现实现步骤C 实现JavaScript 实现 复杂度总结 148. Sort List Given the head of a linked list, return the list after sorting it in ascending order. 解题思路 链表排序问题可以通过多种方法解决&am…

JVM内存结构笔记02-堆

文章目录 堆1.定义2.堆的结构为什么JVM新生代对象年龄只能是 0-15? 3.堆内存溢出4.堆内存诊断代码示例 堆 1.定义 堆是Java 虚拟机所管理的内存中最大的一块&#xff0c;Java 堆是所有线程共享的一块内存区域&#xff0c;在虚拟机启动时创建。此内存区域的唯一目的就是存放对…

labview实现大小端交换移位

在解码时遇到了大小端交换的问题&#xff0c;需要把高低字节的16进制值进行互换&#xff0c;这里一时间不知道怎么操作&#xff0c;本来打算先把16进制转字节数组&#xff0c;算出字节数组的大小&#xff0c;然后通过模2得到0&#xff0c;1&#xff0c;来判断是否为奇数位和偶数…

详细记录swfit微调interVL2-8B多模态大模型进行目标检测(附代码)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 RAGOnMedicalKG&#xff1a;大模型结合知识图谱的RAG实现DSPy&#xff1a;变革式大模…

Unity使用UGUI制作无限滑动列表

原理参照上一篇使用NGUI的制作无限滑动列表的文章 Unity 使用NGUI制作无限滑动列表_unity 滑动列表很多物体-CSDN博客 准备工作&#xff1a; 新建一个空物体命名为LoopList&#xff0c;并调整其大小&#xff0c; 并增加Scroll Rect组件&#xff08;用于滑动&#xff09;、Re…

Docker数据管理,端口映射与容器互联

1.Docker 数据管理 在生产环境中使用 Docker&#xff0c;往往需要对数据进行持久化&#xff0c;或者需要在多个容器之间进行数据共享&#xff0c;这必然涉及容器的数据管理操作。 容器中的管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumns&#xff09;&a…

Unity Shader编程】之基础纹理

一&#xff0c;单张纹理 好的&#xff0c;用户想学习Unity Shader中的单张纹理章节。我需要根据提供的搜索结果来整理相关内容。首先&#xff0c;查看搜索结果中的相关部分&#xff0c;特别是‌、‌、‌、‌、‌这几条&#xff0c;因为它们提到了基础纹理、单张纹理的实现方法…

QT系列教程(18) MVC结构之QItemSelectionModel模型介绍

视频教程 https://www.bilibili.com/video/BV1FP4y1z75U/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 QItemSelectionModel Qt的MVC结构支持多个View共享同一个model&#xff0c;包括该model的选中状态等。我们可以通过设置QItemSelectionModel&#xff0c;来更改View的选…