Spring事务管理

一、事务的基本概念

事务是一系列的操作,它们要么全部完成,要么全部不完成,是一个不可分割的工作单位。事务的处理必须满足其四个基本特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),通常简称为ACID特性。

  • 原子性:事务是一个原子操作单元,其对数据的修改要么全部执行,要么全都不执行。
  • 一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  • 隔离性:事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不会互相干扰。
  • 持久性:一旦事务提交,则其结果就是永久的,即使系统崩溃也不会丢失。
    事务的存在主要是为了处理大量数据操作时可能出现的问题,如数据的不一致性、系统的崩溃等。通过事务,可以确保数据的完整性和安全性,确保数据库在并发操作和系统故障等情况下仍能保持数据的准确性和可靠性。

二、Spring事务管理简介

Spring框架为事务管理提供了全面的支持,它简化了事务管理的复杂性,使得开发人员能够更专注于业务逻辑的实现。Spring支持声明式事务和编程式事务两种方式。

  • 声明式事务:通过在配置文件中进行事务的配置,或者通过在方法上使用@Transactional注解,可以非常方便地实现事务的管理。这种方式不需要编写大量的事务管理代码,因此在实际开发中得到了广泛的应用。
  • 编程式事务:通过编写代码来管理事务的边界,包括事务的开始、提交、回滚等操作。这种方式相对于声明式事务来说更加灵活,但需要编写更多的代码,因此在一些特殊场景下可能会使用到。
    Spring框架通过整合底层的事务管理器,如JDBC、Hibernate等,提供了统一的事务管理接口,使得开发人员可以更加方便地进行事务管理。同时,Spring还提供了丰富的事务传播行为和隔离级别设置,以满足不同场景下的需求。

三、Spring事务传播行为

在Spring框架中,事务传播行为定义了事务方法被另一个事务方法调用时,如何使用事务。Spring支持七种事务传播行为,它们分别是:

  • PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务;如果已存在一个事务中,则加入到这个事务中。这是最常见的选择。
  • PROPAGATION_SUPPORTS:支持当前事务。如果当前存在事务,就加入该事务;如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY:支持当前事务。如果当前存在事务,就加入该事务;如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW:创建新事务,如果当前存在事务,则把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就执行与PROPAGATION_REQUIRED类似的操作。

不同的传播行为适用于不同的业务场景,开发者需要根据实际需求选择合适的事务传播行为。

四、Spring事务隔离级别

事务隔离级别定义了事务与事务之间的隔离程度。Spring支持四种事务隔离级别,这些级别与ANSI SQL标准定义的事务隔离级别相对应:

  • 读未提交(Read Uncommitted):允许读取尚未提交的数据变更,可能会导致脏读、不可重复读和幻读。
  • 读已提交(Read Committed):只允许读取已提交的数据变更,可以避免脏读,但可能会出现不可重复读和幻读。
  • 可重复读(Repeatable Read):在同一个事务内多次读取同一数据,结果总是一致的。可以避免脏读和不可重复读,但可能会有幻读。
  • 串行化(Serializable):最严格的隔离级别,完全串行化事务,避免脏读、不可重复读和幻读,但性能开销最大。

在Spring中,可以通过@Transactional注解的isolation属性来设置事务的隔离级别。例如:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void someTransactionalMethod() {// ...
}

这里,Isolation是org.springframework.transaction.annotation.Isolation枚举类型,它包含了上述四种事务隔离级别。选择合适的隔离级别可以平衡数据的完整性和系统的性能。

五、Spring事务管理器

在Spring框架中,事务管理器是负责事务控制的核心组件。Spring提供了多种事务管理器以支持不同的事务管理需求,其中最常用的是DataSourceTransactionManager
DataSourceTransactionManager是用于管理单个数据源事务的事务管理器。它通过对JDBC连接进行管理,确保事务的ACID特性得到保证。此外,Spring还支持其他事务管理器,如HibernateTransactionManager用于管理Hibernate事务,JtaTransactionManager用于管理分布式事务等。
在使用Spring事务管理时,需要根据具体的应用场景选择合适的事务管理器。同时,Spring还提供了丰富的事务配置选项,如事务的传播行为、隔离级别等,以满足不同业务场景下的事务控制需求。

六、事务的声明式使用

在Spring框架中,声明式事务管理是一种非侵入式的事务管理方式,它将事务管理与业务代码分离,通过注解或XML配置来实现事务管理。这种方式使得代码更加清晰简洁,并且降低了事务管理的复杂度。
在Spring中,我们可以使用@Transactional注解来声明一个方法或类需要被事务管理。当方法被调用时,Spring会自动开启一个事务,并在方法执行完毕后根据执行情况提交或回滚事务。
使用@Transactional注解时,我们可以指定事务的属性,如传播行为、隔离级别、超时时间、只读属性等。这些属性可以帮助我们更好地控制事务的执行。
需要注意的是,为了使@Transactional注解生效,我们需要在Spring配置中开启注解驱动的事务管理,并配置合适的事务管理器。同时,被@Transactional注解的方法或被该注解的类所在的包需要被Spring扫描到,以便Spring能够创建相应的代理对象来处理事务。

七、事务的编程式使用

在Spring中,除了声明式事务外,还支持编程式事务。编程式事务允许开发者在代码中精细控制事务的边界和属性。Spring提供了TransactionTemplate类来简化编程式事务的使用。
使用TransactionTemplate进行编程式事务管理的一般步骤如下:
配置一个PlatformTransactionManager事务管理器。
创建一个TransactionTemplate实例,并设置事务管理器。
在需要执行事务的代码块中,使用TransactionTemplate的execute方法来执行事务。
示例代码:

@Autowired
private PlatformTransactionManager transactionManager;public void executeInTransaction() {TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);transactionTemplate.execute(new TransactionCallbackWithoutReult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {try {// 在这里执行需要事务管理的业务代码} catch (Exception e) {status.setRollbackOnly(); // 发生异常时回滚事务throw e;}}});
}

通过编程式事务,开发者可以根据业务需求更灵活地控制事务的提交、回滚等操作。但相比声明式事务,编程式事务的代码量更大,且容易出错,因此在实际开发中建议优先考虑使用声明式事务。

八、事务常见问题及解决方案

在使用Spring事务的过程中,开发者可能会遇到一些常见问题。以下列举了一些典型问题及其解决方案:
问题1:事务不生效

  • 可能原因:
    • 方法不是public的。@Transactional注解只能应用于public方法。
    • 事务管理器没有正确配置。
    • 数据库中不支持事务,或者使用的数据库连接不支持事务。
  • 解决方案:
    • 确保方法是public的。
    • 检查事务管理器的配置是否正确。
    • 确认数据库和数据库连接支持事务。

问题2:事务不回滚

  • 可能原因:
    • 没有触发事务回滚的异常。默认情况下,Spring只在运行时异常(RuntimeException)和Error发生时回滚事务。
    • 事务传播行为设置不当。
  • 解决方案:
    • 在@Transactional注解中指定rollbackFor属性,明确需要回滚的异常类型。
    • 检查并调整事务的传播行为。

问题3:事务超时

  • 可能原因:
    • 事务执行时间过长,超出了设置的事务超时时间。
    • 数据库锁导致事务阻塞。
  • 解决方案:
    • 在@Transactional注解中增加timeout属性,设置合适的事务超时时间。
    • 分析并解决数据库锁的问题,避免事务长时间阻塞。

以上只是列举了一些常见问题,实际使用中可能还会遇到其他问题。在遇到问题时,建议仔细分析异常信息,查看相关日志,以便找到问题的根本原因并解决。

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

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

相关文章

软件测试的基本概念

目录 1.测试需求 2.测试用例的概念 3.bug 4.软件生命周期 4.1需求分析 4.2计划 4.3编码 4.4测试 4.5运行维护 5.测试模型 5.1敏捷开发模型 5.2scrume 5.3测试模型 5.4w模型(双v模型) 6.软件测试的生命周期 7.BUG的描述和定义 8.如何定义bug的级别 9.BUG的…

机器学习——线性回归

机器学习——线性回归 文章目录 机器学习——线性回归一、什么是线性回归二、一元线性回归方程三、损失函数四、代码实现五、运用说明 一、什么是线性回归 线性回归是一种用来建立自变量和因变量之间线性关系的统计分析方法,也是机器学习中最常见、最容易理解的一个…

Java面试篇【RabbitMQ】常见面试题(2024最新)

RabbitMQ 1.为什么使用MQ?优点是什么 因为MQ可以异步处理,提高系统吞吐量。 应用解耦,系统之间可以通过消息通信,不关心其他系统的处理。 流量削峰,可以通过消息队列的长度,控制请求量。可以缓解短时间内的高并发请…

无线电信号及其分类

有线与无线通信 通信:指信息的交流与传递。 有线通信:用导向性传输媒体,即信息流沿着固体媒体传播。 例如电报、座机都是沿导线传送信号。 无线通信:用非导向性传输媒体,即在自由空间中被传播。分为红外线、电磁波等…

TCP/IP超全笔记 - TCP篇

TCP/IP超全笔记 - TCP篇 什么是 TCP TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接:一对一,先连接,再传输数据可靠交付:…

openGauss gsql 常用元命令 一

openGauss gsql 常用元命令 一 连接数据库 使用 -E 参数可以显示元命令具体执行的 SQL 信息 [ommog1 ~]$ gsql -d postgres -p15400 -E gsql ((openGauss 2.1.0 build 590b0f8e) compiled at 2021-09-30 14:29:04 commit 0 last mr ) Non-SSL connection (SSL connection is…

【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

一、聚簇索引 其实之前内容中介绍的 B 树就是聚簇索引。 这种索引不需要我们显示地使用 INDEX 语句去创建,InnoDB 引擎会自动创建。另外,在 InnoDB 引擎中,聚簇索引就是数据的存储方式。 它有 2 个特点: 特点 1 使用记录主键…

HTTPS安全机制解析:如何保护我们的数据传输

引言 在数字时代,网络安全成为了互联网用户和服务提供者不可忽视的关键议题。特别是,HTTPS(全称为HyperText Transfer Protocol Secure)相比于其前身HTTP(HyperText Transfer Protocol),通过引…

如何恢复已删除的华为手机图片?5 种方式分享

不幸的现实是,华为的珍贵时刻有时会因为意外删除、软件故障或其他不可预见的情况而在眨眼之间消失。在这种情况下,寻求恢复已删除的图片成为个人迫切关心的问题。 本文旨在为用户提供如何从华为恢复已删除图片的实用解决方案。我们将探索五种可行的方法…

6-1 判回文

作者 唐艳琴 单位 中国人民解放军陆军工程大学 本题要求实现一个函数,判断字符串是否是回文。如果是则返回1,否则返回0。 函数接口定义: int isecho(char a[]);返回值为1,表示是回文;返回值为0,表示不是…

光线追踪5- Surface normals and multiple objects

首先,让我们获取一个表面法线,以便进行着色。这是一个垂直于交点处表面的向量。在我们的代码中,我们需要做一个重要的设计决定:法线向量是否为任意长度,还是将其归一化为单位长度。 诱人的是,如果不…

视频远程监控平台EasyCVR集成后播放只有一帧画面的原因排查与解决

智慧安防视频监控平台EasyCVR能在复杂的网络环境中(专网、局域网、广域网、VPN、公网等)将前端海量的设备进行统一集中接入与视频汇聚管理,平台可支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议…

【STM32下UART协议的一些认识与使用方法】

STM32下UART协议的一些认识与使用方法 串口定义通用串行异步收发器 协议中相关的概念空闲位起始位数据位奇偶校验位三种校验方式BT接收数据的流程 停止位波特率总结 UART的三种工作方式UART控制器发送数据流程接收数据流程 UART初始化UART相关结构体和库函数 串口定义 通用串行…

揭秘共享旅游卡项目变现的6种方式,至少有4种适合创业者!

最近每天都有不少的朋友添加我,多数人会问一个问题,共享旅游卡这个项目好不好做?还有部分朋友会问,共享旅游卡有没有市场,是不是有我们所宣传的这样乐观? 从过年前开始,我一直在关注咱们共享旅…

自然语言处理之语言模型(LM)深度解析

自然语言处理(Natural Language Processing,NLP)作为人工智能的一个重要分支,近年来在学术界和工业界均取得了显著的进展。语言模型(Language Model, LM)是自然语言处理技术中的基石,它能够预测…

云计算 3月6号 (crontab-计划任务 日志轮转 免密登录)

一、计划任务 计划任务概念解析 在Linux操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务(如定期备份、定期采集监测数据)。RHEL6系统中默认已安装了at、crontab软件…

抖音视频评论区用户采集工具使用教程

抖音视频评论区用户采集工具是一款用于收集抖音视频评论区用户信息的工具。通过该工具,用户可以提取抖音视频评论区的用户昵称、评论内容、点赞数等信息,并进行数据分析和统计。该工具可以帮助用户了解抖音视频评论区的用户特点和评论趋势,提…

基于Spring Boot + Vue的信息化在线教学平台

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

事务 失效的八种情况

在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我们一般都会用到 spring 事务。 确实,sprin…

Android视角看鸿蒙第一课(工程目录)

Android视角看鸿蒙第一课(工程目录) 导读 鸿蒙马上就来了,这个工作很有可能落到Android开发的头上,既是机遇也是挑战,希望能跟上时代的浪潮,迫不得已开始学习鸿蒙开发,顺带分享记录下 我的学…