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

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

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

相关文章

谷歌正在试行人脸识别办公室安全系统

内容提要&#xff1a; &#x1f9ff;据美国消费者新闻与商业频道 CNBC 获悉&#xff0c;谷歌正在为其企业园区安全测试面部追踪技术。 &#x1f9ff;测试最初在华盛顿州柯克兰的一间办公室进行。 &#x1f9ff;一份内部文件称&#xff0c;谷歌的安全和弹性服务 (GSRS) 团队将…

【android】【adb shell】写一个shell脚本,监听进程pid变化

前言 当前业务&#xff0c;需要写一个脚本&#xff0c;不断监视com.android.phone 进程是否异常死掉 脚本 #!/system/bin/sh last_pid"" current_pid"" while(true){current_pidps -A | grep com.android.phone | awk {print $2}if [ -n "$current…

uni-appx,实现登录功能,弹窗功能。组件之间传值

这篇文章的内容使用组合式API实现的&#xff0c;只有弹窗部分有选择式API的写法介绍。如果想要看其他选择式API&#xff0c;还请下载官方的hello-uni-appx源码进行学习&#xff0c;查看。想要看组合式API的写法&#xff0c;请查看源码 hello-uvue。 hello-uni-appx源码 相比于…

Vue + Element UI + JSEncrypt实现简单登录页面

安装依赖 npm install jsencrypt --save局部引入 import JSEncrypt from jsencrypt/bin/jsencrypt;登录页面index.vue <template><div class"loginbody"><div class"logindata"><div class"logintext"><h2>Wel…

Uncaught (in promise) RangeError: Offset is outside the bounds of the DataView

问题 通常发生在Failed to load resource: the server responded with a status of 404 (Not Found) 后&#xff0c;资源读取错误导致的问题。 解决 Failed to load resource: the server responded with a status of 404 (Not Found)_unity webgl failed to load resource:…

LVS-DR群集

LVS-DR集群 LVS-DR(Linux Virtual Server DIrector Server)工作模式&#xff0c;是生产环境中最常用的一种工作模式。 LVS-DR工作原理 LVS-DR模式&#xff0c;Director Server作为群集的访问入口&#xff0c;不作为网关使用&#xff0c;节点DirectorServer与Real Server需要…

TensorRT-Int8量化详解

int8量化是利用int8乘法替换float32乘法实现性能加速的一种方法 对于常规模型有&#xff1a;y kx b&#xff0c;此时x、k、b都是float32, 对于kx的计算使用float32的乘法 对于int8模型有&#xff1a;y tofp32(toint8(k) * toint8(x)) b&#xff0c;其中int8 * int8结果为in…

Python列表创建使用心得详解

概要 列表是Python中最常用的数据结构之一,它用于存储有序的元素集合。Python提供了多种方式来创建和操作列表,使得列表在数据处理、存储和操作中非常灵活。本文将详细介绍Python列表创建的各种技巧,包括基础创建方法、列表推导式、内置函数和高级创建技巧,并包含具体的示…

初出茅庐的小李博客之C语言文件操作

C语言文件操作 在C语言中&#xff0c;文件操作主要是通过标准库函数来实现的。 今天有时间就来学习下一些常用的文件操作函数&#xff1a; C 语言提供了一个 FILE 数据结构&#xff0c;记录了操作一个文件所需要的信息。该结构定义在头文件stdio.h&#xff0c;所有文件操作函…

python库(3):Cerberus库

1 Cerberus简介 Cerberus 是一个Python数据验证库&#xff0c;设计用于验证数据结构的有效性和一致性。它提供了一种简单而强大的方式来定义和应用验证规则&#xff0c;特别适用于处理用户输入的验证、配置文件的检查以及API的参数验证等场景。下面将详细介绍 Cerberus 的特点…

伦敦金价格走势图的资金管理怎么进行?

要成熟地交易伦敦金价格走势图&#xff0c;其实并不是一件容易的事情。其一&#xff0c;我们在很多广告或者周边朋友的宣传之下&#xff0c;觉得它能够帮助我们很快之内实现很多的财富增值&#xff0c;其二&#xff0c;很多投资者觉得伦敦金交易虽然不错&#xff0c;但是风险好…

对象被优化以后才是高效的C++编程

课程总目录 文章目录 一、对象会调用哪些方法、对象优化的三个原则二、CMyString的代码问题三、四、添加带右值引用参数的拷贝构造和赋值函数五、CMyString在vector上的应用六、move移动语义和forward类型完美转发七、再聊vector容器使用对象过程中的优化 一、对象会调用哪些方…

Python从0到100(三十六):字符和字符集基础知识及其在Python中的应用

1. 字符和字符集概述 字符(Character)是构成书面语言的基本元素&#xff0c;它包括但不限于各国家的文字、标点符号、图形符号和数字。字符集(Character set)则是一个包含多个字符的系统&#xff0c;用于统一管理和编码不同的字符。 常见字符集 ASCII&#xff1a;最早的字符…

SpringBoot 启动流程一

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

音视频流媒体视频平台LntonAIServer视频监控平台工业排污检测算法

在当今社会&#xff0c;环境保护和可持续发展已成为全球关注的焦点。工业生产作为经济发展的重要支柱&#xff0c;其对环境的影响不容忽视。因此&#xff0c;如何有效地监控和管理工业排污&#xff0c;成为了一个亟待解决的问题。LntonAIServer工业排污检测算法应运而生&#x…

开发电商ERP系统需要接入哪些平台API?

跟随全渠道发展趋势&#xff0c;很多实体商家开设电商店铺&#xff0c;为消费者提供便捷的购物体验&#xff0c;增强消费者的满意度&#xff0c;同时也提升了企业自身的市场竞争力。为了满足商家业务拓展需求&#xff0c;很多原本主要服务于实体商贸企业的ERP服务商&#xff0c…

CSS filter(滤镜)属性,并实现页面置灰效果

目录 一、filter&#xff08;滤镜&#xff09;属性 二、准备工作 三、常用的filter属性值 1、blur(px) 2、brightness(%) 3、contrast(%) 4、grayscale(%) 5、opacity(%) 6、saturate(%) 7、sepia(%) 8、invert(%) 9、hue-rotate(deg) 10、drop-shadow(h-shadow v…

编译rust程序,并让它依赖低版本的GLIBC库

在linux环境下编译rust程序,编译好的程序会依赖你当前系统的GLIBC库,也就是说你的程序无法在使用更低版本GLIBC库的linux系统中运行。 查看当前系统的GLIBC版本: strings /lib64/libc.so.6 | grep GLIBC 为了让编译的程序依赖比较低版本的GLIBC库,我们最好在centos7下编译…

JavaScript基础-函数(完整版)

文章目录 函数基本使用函数提升函数参数arguments对象&#xff08;了解&#xff09;剩余参数(重点)展开运算符(...) 逻辑中断函数参数-默认参数函数返回值-return作用域(scope)全局作用域局部作用域变量的访问原则垃圾回收机制闭包 匿名函数函数表达式立即执行函数 箭头函数箭头…

【机器学习】Google开源大模型Gemma2:原理、微调训练及推理部署实战

目录 一、引言 二、模型简介 2.1 Gemma2概述 2.2 Gemma2 模型架构 三、训练与推理 3.1 Gemma2 模型训练 3.1.1 下载基座模型 3.1.2 导入依赖库 3.1.3 量化配置 3.1.4 分词器和模型实例化 3.1.5 引入PEFT进行LORA配置 3.1.6 样本数据清洗与加载 3.1.7 模型训练与保…