Spring 事务管理:全面解析
Spring 框架是一款广受欢迎的 Java 开发框架,其强大的功能之一便是事务管理。事务管理在确保数据一致性和完整性方面至关重要。在这篇文章中,我们将深入探讨 Spring 事务管理,包括声明式事务管理、编程式事务管理,以及事务传播和隔离级别。
声明式事务管理
声明式事务管理是 Spring 框架的一个核心功能,它允许开发者通过配置和注解来管理事务,而不需要在代码中显式地进行事务管理操作。这种方式的主要优点是简化了代码,提高了可读性和可维护性。
使用注解进行声明式事务管理
Spring 提供了 @Transactional 注解,用于声明式事务管理。你只需在需要进行事务管理的方法或类上加上这个注解,Spring 就会自动处理事务的开始、提交和回滚。
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Transactionalpublic void createUser(User user) {// 保存用户userRepository.save(user);// 添加角色roleRepository.addRoleToUser(user.getId(), "ROLE_USER");}
}
在上述示例中,createUser 方法被 @Transactional 注解标记,这意味着该方法中的所有数据库操作将在同一个事务中进行。如果方法执行过程中出现异常,Spring 将自动回滚事务,确保数据一致性。
XML 配置
除了使用注解,Spring 还支持通过 XML 配置文件来声明事务。
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="create*" propagation="REQUIRED"/></tx:attributes>
</tx:advice><aop:config><aop:pointcut id="userServiceOperation" expression="execution(* com.example.service.UserService.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="userServiceOperation"/>
</aop:config>
编程式事务管理
虽然声明式事务管理更为常用,但在某些复杂场景下,编程式事务管理可能更为合适。Spring 提供了 PlatformTransactionManager 接口,允许开发者在代码中手动管理事务。
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;@Service
public class ProductService {@Autowiredprivate PlatformTransactionManager transactionManager;public void addProduct(Product product) {TransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(def);try {// 保存产品productRepository.save(product);// 保存库存inventoryRepository.addInventory(product.getId(), 100);transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);throw e;}}
}
在这个例子中,我们手动启动了一个事务,并在操作成功时提交事务,出现异常时回滚事务。虽然这种方法灵活性更高,但也增加了代码复杂性。
事务传播和隔离级别
Spring 事务管理的另一个重要方面是事务传播和隔离级别。了解和正确使用这些特性,可以帮助你处理更为复杂的事务场景。
事务传播
事务传播定义了在嵌套调用方法时,如何处理事务。Spring 提供了七种传播行为:
- PROPAGATION_REQUIRED:默认传播行为。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
- PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- PROPAGATION_REQUIRES_NEW:创建一个新的事务。如果当前存在事务,则挂起当前事务。
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行。如果当前存在事务,则挂起当前事务。
- PROPAGATION_NEVER:以非事务方式执行。如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。
事务隔离级别
事务隔离级别定义了一个事务与其他事务之间的隔离程度。常见的隔离级别有:
- ISOLATION_READ_UNCOMMITTED:允许读取未提交的数据,可能导致脏读、不可重复读和幻读。
- ISOLATION_READ_COMMITTED:只能读取已提交的数据,防止脏读,但可能导致不可重复读和幻读。
- ISOLATION_REPEATABLE_READ:防止脏读和不可重复读,但可能导致幻读。
- ISOLATION_SERIALIZABLE:最高的隔离级别,防止脏读、不可重复读和幻读,但性能较低。
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void processOrder(Order order) {// 处理订单
}
在这个示例中,processOrder 方法被配置为在一个新的事务中执行,并且使用 SERIALIZABLE 隔离级别,确保最高的隔离程度。
总结
Spring 事务管理为我们提供了强大且灵活的工具,无论是通过声明式事务管理简化代码,还是通过编程式事务管理处理复杂场景,亦或是通过事务传播和隔离级别应对各种并发问题,都能帮助我们在开发过程中有效管理事务。
相关文章:

Spring 事务管理:全面解析
Spring 框架是一款广受欢迎的 Java 开发框架,其强大的功能之一便是事务管理。事务管理在确保数据一致性和完整性方面至关重要。在这篇文章中,我们将深入探讨 Spring 事务管理,包括声明式事务管理、编程式事务管理,以及事务传播和隔…...

概率论与数理统计_上_科学出版社
contents 前言第1章 事件与概率1.1 随机事件与样本空间1.1.1 样本空间1.1.2 随机事件1.1.3 事件之间的关系与运算 1.2 概率的三种定义及其性质1.2.1 概率的统计定义1.2.2 概率的古典定义1.2.3 概率的几何定义1.2.4 概率的性质 1.3 常用概型公式1.3.1 条件概率计算公式1.3.2 乘法…...

昇思25天学习打卡营第11天|LSTM+CRF序列标注
序列标注指给定输入序列,给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取,包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 和人理解语言一样,…...

CSS 核心知识点 - grid
思维导图 参考网址: https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_grid_layout 一、什么是 grid? CSS Grid布局是在CSS3规范中引入的一种新的布局方式,旨在解决传统布局方法(如浮动、定位、表格布局)存在的许多问题。C…...

pyecharts可视化案例大全(1~10)
pyecharts可视化案例大全 一、堆叠柱状图二、关闭坐标轴显示三、自定义坐标轴标签文本四、更改坐标轴数据类型五、双Y轴【直方图&折线图】六、直方图——双Y轴七、折线图——双X轴八、图例选择设置单选九、缩略轴——inside组件十、缩略轴——slider组件一、堆叠柱状图 不…...

SpringBoot 启动流程一
SpringBoot启动流程一 我们首先创建一个新的springboot工程 我们不添加任何依赖 查看一下pom文件 我们创建一个文本文档 记录我们的工作流程 我们需要的是通过打断点实现 我们首先看一下启动响应类 package com.bigdata1421.start_up;import org.springframework.boot.Spr…...

打印机删除副本以后无法安装打印机驱动
根据知乎文章解决打印机驱动副本存在多个,打印机驱动无法删除,或者驱动包无法删除等问题。的方法删除打印机副本以后发现无论如何也装不上驱动了。 要么驱动安装成功,但是设备仍然是指定状态。 后面发现是删错文件夹了,教程里让删…...

Vue3中为Ant Design Vue中Modal.confirm自定义内容
在一次业务开发时代码时,碰到了一种既想要Modal.confirm样式,又想要定制其content内容的情况。 大部分情况下,使用Modal.method()这种方式时,可能content内容固定都是字符串,那如果想要做更高级的交互怎么办ÿ…...

智能猫砂盆到底哪家好用?自费实测聚宠、糯雪、CEWEY真实反馈!
快到夏天了,是不是还有人因为没挑选到喜欢的智能猫砂盆而苦恼着?太便宜怕不好用,太贵怕质量比不上价格。来来去去拖到现在还没决定,我作为养了四年猫的资深铲屎官,今天就来给大家传授经验,关于我是怎么从好…...

初阶数据结构之二叉树
那么本篇文是初阶数据结构这个系列的最后一篇文章,那么闲话少叙,我们直接进入正题 在讲二叉树的一些之前知识点之前,我先给大家送个小礼物哈 手搓二叉树 typedef int BTDataType ; typedef struct BinaryTreeNode { BTDataType _data …...

代码随想三刷动态规划篇8
代码随想三刷动态规划篇8 122. 买卖股票的最佳时机 II题目代码 123. 买卖股票的最佳时机 III题目代码 188. 买卖股票的最佳时机 IV题目代码 309. 买卖股票的最佳时机含冷冻期题目代码 122. 买卖股票的最佳时机 II 题目 链接 代码 class Solution {public int maxProfit(int…...

服务拆分的原则
目录 一、单一职责原则 二、服务自治原则 三、单向依赖 一、单一职责原则 单⼀职责原则原本是面向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多于⼀个导致类变更的原因 在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该…...

离线安装docker社区版
提示:以下所有命令都在Ubuntu-24.04-live-server-amd64系统中运行 文章目录 前言一、离线包制作二、在目标系统上离线安装Docker CE总结 前言 安全原因,内部机器不能联网,要给新机器安装 docker-ce 只能使用离线安装方法。如果使用本文的下载…...

徒手绘制 Android 通用进度条
拖动条(FlexSeekBar),在Android的各个地方都非常常用,本文旨在自研一套通用的进度条,非常适合车载App使用 样式如下: 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…...

【TB作品】矩阵键盘电话拨号,ATMEGA16单片机,Proteus仿真 atmega16矩阵键盘电话拨号
atmega16矩阵键盘电话拨号 c代码和仿真图: 使用ATmega16实现矩阵键盘电话拨号功能 项目背景 在电子设计和嵌入式系统开发中,矩阵键盘是常见的人机交互方式。它可以实现较多按键的输入,同时节省单片机的I/O资源。结合LCD显示和蜂鸣器&am…...

JavaScript(6)——数据类型转换
为什么需要类型转换? JavaScript是弱数据类型:JavaScript不知道变量到底属于哪种数据类型,只有赋值了才清除 使用表单,prompt获取的数据默认为字符串类型,此时不能直接进行算数运算 隐式转换 某些运算符被执行时&am…...

概率论与数理统计_下_科学出版社
contents 前言第5章 大数定律与中心极限定理独立同分布中心极限定理 第6章 数理统计的基本概念6.1 总体与样本6.2 经验分布与频率直方图6.3 统计量6.4 正态总体抽样分布定理6.4.1 卡方分布、t 分布、F 分布6.4.2 正态总体抽样分布基本定理 第7章 参数估计7.1 点估计7.1.1 矩估计…...

Android 复习layer-list使用
<shape android:shape"rectangle"> <size android:width"1dp" android:height"100px" /> <solid android:color"#FFFFFF" /> </shape> 通过shape画线段,通过 <item android:gravity"left|top"…...

汉光联创HGLM2200N黑白激光多功能一体机加粉及常见问题处理
基本参数: 机器型号:HGLM2200N 产品名称:A4黑白激光多功能一体机 基础功能:打印、扫描、复印 打印速度:22页/分钟 纸张输入容量:150-249页 单面支持纸张尺寸:A4、A5、A6 产品尺寸&#x…...

引领汽车软件开发走向ASPICE认证之路
亚远景科技与ASPICE认证的关系可以从以下几个方面来阐述: (要明确的是:在ASPICE行业中专业来说,ASPICE项目是没有认证,而只有评估。不过,为了方便沟通,人们常将这一评估过程称为认证。) 行业专…...

【C/C++ new/delete和malloc/free的异同及原理】
new/delete和malloc/free都是用于在C(以及C语言在malloc/free的情况下)中动态申请和释放内存的机制,但它们之间存在一些显著的异同点。以下是对这两组函数/运算符的异同点的详细分析: 相同点 目的相同:两者都用于在堆…...

Maven Archetype 自定义项目模板:高效开发的最佳实践
文章目录 前言一、Maven Archetype二、创建自定义 Maven Archetype三、定制 Archetype 模板四、手动创建 Archetype 模板项目五、FAQ5.1 如何删除自定义的模板5.2 是否可以在模板中使用空文件夹 六、小结推荐阅读 前言 在软件开发中,标准化和快速初始化项目结构能够…...

vue的ESLint 4格缩进 笔记
https://chatgpt.com/share/738c8560-5271-45c4-9de0-511fad862109 一,代码4格缩进设置 .eslintrc.js文件 module.exports { "rules": { "indent": ["error", 4] } }; 自动修复命令 npx eslint --fix "src/**/*.{…...

【前端项目笔记】8 订单管理
订单管理 效果展示: 在开发功能之前先创建分支order cls 清屏 git branch 查看所有分支(*代表当前分支) git checkout -b order 新建分支order git push -u origin order 将本地的当前分支提交到云端仓库origin中命名为order 通过路由方式…...

构建Yarn依赖树:深入解析与实践指南
构建Yarn依赖树:深入解析与实践指南 在现代JavaScript开发中,依赖管理是项目成功的关键。Yarn,作为Node.js生态系统中一个强大的包管理器,以其快速、可靠和安全的特性而闻名。本文将深入探讨Yarn如何构建依赖树,并提供…...

社区活动|FlowUs知识库的发展|先进技术的落地应用|下一代生产力工具你用了吗
在当今快速发展的数字化时代,技术的进步不断推动着工作方式和知识管理的革新。FlowUs,作为一款前沿的知识管理和协作平台,正站在这一变革的浪潮之巅,引领着智能工作的新潮流。 智能化的智能学习引导工具 FlowUs不仅仅是一个工具&…...

Python基础语法(与C++对比)(持续更新ing)
代码块 Python在统一缩进体系内,为同一代码块C{...}内部的为同一代码块 注释 Python 单行注释:#... 多行注释:... C 单行注释://... 多行注释: /*...*/ 数据类型 1. Python数据类型 Python中支持数字之间使用下划线 _ 分割…...

LeetCode-Leetcode 1120:子树的最大平均值
LeetCode-Leetcode 1120:子树的最大平均值 题目描述:解题思路一:递归解题思路二:0解题思路三:0 题目描述: 给你一棵二叉树的根节点 root,找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子…...

AI在软件开发中的角色:助手还是取代者?
目录 前言 一、AI工具现状:高效助手的崛起 二、AI对开发者的影响:新技能与竞争力的重塑 三、AI开发的未来:共生而非取代 写在最后 前言 随着科技的飞速发展,生成式人工智能(AIGC)在软件开发领域的应用日…...

jboss 7.2
链接: https://pan.baidu.com/s/19PSAy-Wy8DjcUMy94eqWnw 提取码: rgxf 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v3的分享链接: https://pan.baidu.com/s/19PSAy-Wy8DjcUMy94eqWnw 提取码: rgxf 复制这段内容后打开百度网盘手机App…...