16:事务-Java Spring

目录

  • 16.1 Spring事务管理原理
  • 16.2 Spring事务配置与代码示例
  • 16.3 事务策略的区别
  • 16.4 Spring事务应用场景总结

16.1 Spring事务管理原理

Spring事务管理基于AOP(面向切面编程)实现,通过拦截方法调用,对业务逻辑进行增强,确保事务的正确开启、提交或回滚。其核心组件包括:

  1. PlatformTransactionManager:事务管理器接口,定义了管理和控制事务的基本操作。具体实现如DataSourceTransactionManager(针对JDBC)、HibernateTransactionManager(针对Hibernate)等。

  2. TransactionDefinition:事务定义接口,描述事务的属性,如隔离级别、传播行为、超时时间、是否只读等。

  3. TransactionStatus:事务状态接口,用于查询和控制事务的状态。

16.2 Spring事务配置与代码示例

Spring事务可以通过XML配置、注解驱动等方式进行配置。以下为注解驱动的示例:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactional(rollbackFor = Exception.class)public void createUser(String name, String email) {User user = new User(name, email);userRepository.save(user);// 模拟抛出异常,触发事务回滚if ("error@example.com".equals(email)) {throw new IllegalArgumentException("Invalid email");}}
}

在上述代码中,@Transactional注解标记了createUser方法为一个事务方法。当该方法内发生未被捕获的异常时,Spring会自动回滚事务,保证数据的一致性。

16.3 事务策略的区别

隔离级别:SQL标准定义了四种隔离级别(读未提交、读已提交、可重复读、串行化),分别对应不同的并发问题(脏读、不可重复读、幻读)。Spring允许开发者根据业务需求调整隔离级别。

  • DEFAULT:由数据库决定。
  • READ_UNCOMMITTED:最低隔离级别,可能发生脏读、不可重复读、幻读。
  • READ_COMMITTED:避免脏读,但可能出现不可重复读、幻读。
  • REPEATABLE_READ:避免脏读、不可重复读,但可能出现幻读。
  • SERIALIZABLE:最高隔离级别,完全避免并发问题,但可能导致性能下降。
@Service
public class TransactionalService {// READ_COMMITTED:避免脏读,但可能出现不可重复读、幻读。@Transactional(isolation = Isolation.READ_COMMITTED)public void readCommittedTransaction() {// 执行业务逻辑...}// SERIALIZABLE:最高隔离级别,完全避免并发问题,但可能导致性能下降。@Transactional(isolation = Isolation.SERIALIZABLE)public void serializableTransaction() {// 执行业务逻辑...}
}

传播行为:定义了当前方法事务如何与已有事务(如果存在)交互。常见的传播行为有:

  • REQUIRED:若当前存在事务,则加入该事务;否则创建新事务。
  • REQUIRES_NEW:无论当前是否存在事务,均创建新事务。原事务挂起。
  • SUPPORTS:若当前存在事务,则加入该事务;否则以非事务方式执行。
  • NOT_SUPPORTED:以非事务方式执行,若当前存在事务,则挂起。
@Service
public class TransactionalService {@Autowiredprivate AnotherService anotherService;// REQUIRED:如果当前存在事务,则加入该事务;否则创建新事务。@Transactional(propagation = Propagation.REQUIRED)public void requiredTransaction() {// 执行业务逻辑...anotherService.someMethod();}// REQUIRES_NEW:总是新建事务,当前事务(若有)挂起。@Transactional(propagation = Propagation.REQUIRES_NEW)public void requiresNewTransaction() {// 执行业务逻辑...}// NEVER:不能在事务环境下执行,否则抛出异常。@Transactional(propagation = Propagation.NEVER)public void neverTransaction() {// 执行业务逻辑...}
}

超时设置:指定事务可以持续的最长时间,防止事务长时间阻塞资源。

只读标志:声明事务为只读,数据库可能据此优化查询性能,某些数据库在只读事务中不允许执行更新操作。

@Service
public class TransactionalService {@Transactional(readOnly = true)public void readOnlyTransaction() {// 执行只读查询操作...}
}

16.4 Spring事务应用场景总结

  1. 数据密集型业务:如银行转账、订单处理、库存管理等,涉及多个数据库操作,必须保证事务的ACID特性以维护数据一致性。

  2. 分布式事务:Spring支持与分布式事务解决方案(如两阶段提交、Saga模式、Seata等)集成,适用于微服务架构中的跨服务数据一致性问题。

  3. 批量操作:对于大量数据的插入、更新、删除等操作,使用事务可以确保操作的原子性,避免部分成功导致的数据不一致。

  4. 幂等性保障:对于需要保证幂等性的接口(如支付、退款等),利用事务可以确保在并发请求下,多次相同的请求对系统状态的影响与一次请求相同。

总结,Spring事务管理为开发者提供了便捷、强大的事务控制工具。理解其原理、掌握配置与使用方法,并依据业务场景选择合适的事务策略,是构建健壮、可靠的企业级应用的关键。

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

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

相关文章

开源模型应用落地-chatglm3-6b-集成langchain(十)

一、前言 langchain框架调用本地模型,使得用户可以直接提出问题或发送指令,而无需担心具体的步骤或流程。通过LangChain和chatglm3-6b模型的整合,可以更好地处理对话,提供更智能、更准确的响应,从而提高对话系统的性能…

构建企业信息安全防护体系:以电子文档安全为核心

随着信息社会的飞速发展与企业信息化建设的深入,企业的商业机密已从传统的纸质文件转向各类电子文档,如CAD图纸、Office文档等。这些数字化的信息载体在提升工作效率、便捷信息流转的同时,也成为了企业内部数据安全面临的主要挑战。如何有效地…

基于springboot实现中药实验管理系统设计项目【项目源码+论文说明】

基于springboot实现中药实验管理系统设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足,创建了一个计算机管理中药实验管…

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】 题目描述:解题思路一:记录父节点 DFS解题思路二:解题思路三:深度优先搜索建图 广度优先搜索求感染时间【最容易理解】 题目描述: 给…

Python 将Influxdb时序数据写入mysql库时遇到的问题

使用python的 influxdb、pandas、pymysql模块,将influxdb的时序数据,抽取到myl中。 使用influxdb模块中的DataframeClient初始化一个连接实例,然后通过实例的quey()方法,执行influxQL查询,查询需要的数据,…

springboot如何返回中文json,保证顺序。LinkedHashMap应用实例

在业务中有时候需要中文json去进行映射到有些UI上,而springboot都是英文字段 //通过id查询消火栓的基本信息和检测值给POIGetMapping("/queryPOIForHydrant")ApiOperationSupport(order 4)ApiOperation(value "查询所需要的消火栓数据渲染给POI&qu…

实现Spring底层机制(三)

文章目录 阶段4—实现BeanPostProcessor机制1.文件目录2.初始化方法实现1.编写初始化接口InitializingBean.java2.MonsterService.java实现初始化接口3.容器中的createBean方法增加初始化逻辑,判断对象类型是否是InitializingBean的子类型,如果是&#x…

FRP远程连接

前言 通过frp和跳板机完成局域网服务器访问。工具地址:https://github.com/fatedier/frp 配置frp过程 下载frp工具,下载地址如下: https://github.com/fatedier/frp/releases 这里我选择了v0.57.0 解压到本地路径 tar -zxvf xxxxxx.tar.gz配…

python爬虫学习第二十八天-------了解scrapy(二十八天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

接口测试和Mock学习路线(中)

1.什么是 swagger Swagger 是一个用于生成、描述和调用 RESTful 接口的 WEB 服务。 通俗的来讲,Swagger 就是将项目中所有想要暴露的接口展现在页面上,并且可以进行接口调用和测试的服务。 现在大部分的项目都使用了 swagger,因为这样后端…

有哪些强化学习的算法以及它们的原理及优缺点

强化学习是一种机器学习方法,其目标是设计智能体(agent),使其能够通过与环境的交互学习最优的行为策略。下面将介绍几种主要的强化学习算法,包括Q-Learning、Deep Q-Network(DQN)、Policy Gradi…

C语言如何进⾏指针运算?

一、问题 普通变量可以运算,那么指针可以吗?答案是肯定的。那么如何运算呢,下⾯就来介绍⼀下。 二、解答 我们知道可以利⽤指针⽅便地对数组元素进⾏⽐较和查找,那么这就需要对指针进⾏运算。 (1)⾃增/⾃…

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后,进行的离线处理和实时处理两条业务线,现在再来学习flume和kafka的整合处理。 配置fl…

微信小程序开发工具的使用,各个配置文件详解,小程序开发快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

redis单线程模型

工作原理 在Redis中,当两个客户端同时发送相同的请求时,Redis采用单线程模型来处理所有的客户端请求,会依次处理这些请求,每个请求都会按照先后顺序被执行,不会同时处理多个请求。使得Redis能够避免多线程并发访问数据…

大语言模型应用指南:以ChatGPT为起点,从入门到精通的AI实践教程

目录 前言ChatGPT问世和发展展望未来大语言模型应用指南 特点大语言模型应用指南 主要内容 前言 在20世纪末和21世纪初,人类经历了两次信息革命的浪潮。 第一次是互联网时代的兴起,将世界各地连接在一起,改变了人们获取信息和交流的方式。 …

Nobe.js的安装与配置

1. **下载**:访问Node.js官网,选择适合自己操作系统的安装包进行下载。 2. **安装**:双击下载好的安装包并按照提示进行安装。在安装过程中,可以选择自定义安装路径,并确保勾选接受许可协议。 3. **环境变量配置**&…

函数式接口及Stream流式计算

一、什么是函数式接口 只有一个方法的接口,例如 FunctionalInterface public interface Runnable { public abstract void run(); }二、Function函数式接口:有一个输入参数,有一个输出 三、断定型接口:有一个输入参数&#xf…

YOLO如何入门?

入门 YOLO 目标检测算法,你可以遵循以下步骤: 1. 理解目标检测的基本概念:了解目标检测在计算机视觉中的作用,以及它如何帮助识别和定位图像中的对象。 2. 学习基础的机器学习和深度学习知识:熟悉基础的机器学习算法…

使用rsync建立MySQL从节点

使用场景:MySQL主节点存储较大,使用xtrabackup会遇到异常的情况 前置条件:node-01 与 node-02 做过ssh互信,rsync客户端均已安装,主节点开启binlog node-01 原主节点,数据存放目录为 /var/lib/mysql node-0…