当前位置: 首页 > news >正文

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 提供了七种传播行为:

  1. PROPAGATION_REQUIRED:默认传播行为。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  2. PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
  3. PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  4. PROPAGATION_REQUIRES_NEW:创建一个新的事务。如果当前存在事务,则挂起当前事务。
  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行。如果当前存在事务,则挂起当前事务。
  6. PROPAGATION_NEVER:以非事务方式执行。如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。
事务隔离级别

事务隔离级别定义了一个事务与其他事务之间的隔离程度。常见的隔离级别有:

  1. ISOLATION_READ_UNCOMMITTED:允许读取未提交的数据,可能导致脏读、不可重复读和幻读。
  2. ISOLATION_READ_COMMITTED:只能读取已提交的数据,防止脏读,但可能导致不可重复读和幻读。
  3. ISOLATION_REPEATABLE_READ:防止脏读和不可重复读,但可能导致幻读。
  4. ISOLATION_SERIALIZABLE:最高的隔离级别,防止脏读、不可重复读和幻读,但性能较低。
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void processOrder(Order order) {// 处理订单
}

在这个示例中,processOrder 方法被配置为在一个新的事务中执行,并且使用 SERIALIZABLE 隔离级别,确保最高的隔离程度。

总结

Spring 事务管理为我们提供了强大且灵活的工具,无论是通过声明式事务管理简化代码,还是通过编程式事务管理处理复杂场景,亦或是通过事务传播和隔离级别应对各种并发问题,都能帮助我们在开发过程中有效管理事务。

相关文章:

Spring 事务管理:全面解析

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

概率论与数理统计_上_科学出版社

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序列标注

序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 和人理解语言一样&#xff0c…...

CSS 核心知识点 - grid

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

pyecharts可视化案例大全(1~10)

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

SpringBoot 启动流程一

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

打印机删除副本以后无法安装打印机驱动

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

Vue3中为Ant Design Vue中Modal.confirm自定义内容

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

智能猫砂盆到底哪家好用?自费实测聚宠、糯雪、CEWEY真实反馈!

快到夏天了&#xff0c;是不是还有人因为没挑选到喜欢的智能猫砂盆而苦恼着&#xff1f;太便宜怕不好用&#xff0c;太贵怕质量比不上价格。来来去去拖到现在还没决定&#xff0c;我作为养了四年猫的资深铲屎官&#xff0c;今天就来给大家传授经验&#xff0c;关于我是怎么从好…...

初阶数据结构之二叉树

那么本篇文是初阶数据结构这个系列的最后一篇文章&#xff0c;那么闲话少叙&#xff0c;我们直接进入正题 在讲二叉树的一些之前知识点之前&#xff0c;我先给大家送个小礼物哈 手搓二叉树 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社区版

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

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…...

【TB作品】矩阵键盘电话拨号,ATMEGA16单片机,Proteus仿真 atmega16矩阵键盘电话拨号

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

JavaScript(6)——数据类型转换

为什么需要类型转换&#xff1f; JavaScript是弱数据类型&#xff1a;JavaScript不知道变量到底属于哪种数据类型&#xff0c;只有赋值了才清除 使用表单&#xff0c;prompt获取的数据默认为字符串类型&#xff0c;此时不能直接进行算数运算 隐式转换 某些运算符被执行时&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黑白激光多功能一体机加粉及常见问题处理

基本参数&#xff1a; 机器型号&#xff1a;HGLM2200N 产品名称&#xff1a;A4黑白激光多功能一体机 基础功能&#xff1a;打印、扫描、复印 打印速度&#xff1a;22页/分钟 纸张输入容量&#xff1a;150-249页 单面支持纸张尺寸&#xff1a;A4、A5、A6 产品尺寸&#x…...

引领汽车软件开发走向ASPICE认证之路

亚远景科技与ASPICE认证的关系可以从以下几个方面来阐述&#xff1a; (要明确的是&#xff1a;在ASPICE行业中专业来说&#xff0c;ASPICE项目是没有认证&#xff0c;而只有评估。不过&#xff0c;为了方便沟通&#xff0c;人们常将这一评估过程称为认证。&#xff09; 行业专…...

《当下的力量》前三章深度解读:从思维奴隶到临在大师的觉醒之路

《当下的力量》前三章深度解读&#xff1a;从思维奴隶到临在大师的觉醒之路这是一本不能用大脑读的书&#xff0c;这是一本需要用生命去体验的书。——张德芬前言 在这个信息爆炸、节奏飞快的时代&#xff0c;我们似乎永远活在过去的遗憾和未来的焦虑中。我们的大脑像一台永不停…...

告别割裂开发:用WebUI插件在UE5里无缝嵌入你的React/Vue应用(附完整交互蓝图)

告别割裂开发&#xff1a;用WebUI插件在UE5里无缝嵌入你的React/Vue应用&#xff08;附完整交互蓝图&#xff09;在数字孪生和企业级可视化项目中&#xff0c;前端团队往往已经用React或Vue构建了复杂的数据看板&#xff0c;而3D场景部分则由UE5团队负责。传统做法是将两者分开…...

二进制量化技术如何优化大语言模型部署

1. 二进制量化技术在大语言模型中的革新应用在人工智能领域&#xff0c;大语言模型(LLM)的规模呈指数级增长&#xff0c;随之而来的是巨大的计算资源消耗和内存需求。传统FP16精度模型需要消耗数十GB甚至上百GB的显存&#xff0c;这使得在消费级硬件和边缘设备上部署变得异常困…...

Windows用户必看!终极免费的PDF处理工具Poppler快速安装指南

Windows用户必看&#xff01;终极免费的PDF处理工具Poppler快速安装指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows系统上处理P…...

环境配置助手 For Mac:macOS环境变量可视化管理工具

环境配置助手 For Mac&#xff1a;macOS环境变量可视化管理工具 本文介绍一款适用于 macOS 的环境变量可视化管理工具&#xff0c;聚焦其核心功能与配置逻辑。 工具简介 环境配置助手 是一款专为 macOS 打造的可视化环境变量管理工具。它通过图形化界面替代传统的命令行编辑方…...

起点中文网字体反爬破解:WOFF2解析与PUA映射还原实战

1. 为什么起点中文网的字体反爬让90%的爬虫新手直接卡死在第一章&#xff1f;你写好requests&#xff0c;配好headers&#xff0c;连上代理池&#xff0c;信心满满地把起点中文网的小说页面curl下来——结果页面里本该是“第123章 天降神兵”的地方&#xff0c;赫然显示一串乱码…...

defx.nvim 会话管理指南:保存和恢复文件浏览器状态

defx.nvim 会话管理指南&#xff1a;保存和恢复文件浏览器状态 【免费下载链接】defx.nvim :file_folder: The dark powered file explorer implementation for neovim/Vim8 项目地址: https://gitcode.com/gh_mirrors/de/defx.nvim defx.nvim 是一款为 neovim/Vim8 打造…...

量子机器学习预测误差:从T/N线性关系到紧致界理论突破

1. 量子机器学习预测误差&#xff1a;从理论到实践的深度解析在量子机器学习这个前沿交叉领域&#xff0c;我们常常面临一个核心挑战&#xff1a;如何评估一个在有限数据上训练出的量子模型&#xff0c;面对全新未知数据时的真实表现&#xff1f;这不仅是理论研究者关心的课题&…...

告别传统地形!用Unreal Engine的Voxel Plugin手把手教你做可破坏的无限世界(含动态NavMesh配置)

告别传统地形&#xff01;用Unreal Engine的Voxel Plugin打造可破坏的无限世界在游戏开发领域&#xff0c;地形系统一直是构建虚拟世界的基石。传统Landscape系统虽然成熟稳定&#xff0c;但面对日益增长的玩家对交互性和自由度的需求&#xff0c;静态地形已经难以满足现代沙盒…...

如何在本地部署大模型-ollama_(保姆级教程)

一、部署方式选择 部署方式上手难度核心特点适用场景Ollama⭐命令极简&#xff0c;自动适配环境&#xff0c;自带 API 接口新手日常本地调用、快速测试LM Studio⭐图形化操作&#xff0c;无需敲代码&#xff0c;兼容 OpenAI 接口不想使用命令行、纯可视化使用Text Generation …...