Spring5应用之事务处理

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客
当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客

文章目录

  • 参考文献
  • 前言
  • 事务处理
    • 什么是事物?
    • 如何控制事务?
  • Spring控制事务开发
    • 思路分析
    • 编码分析
    • 细节分析
  • 总结

参考文献

  • 孙哥suns说Spring5~学不会Spring? 因为你没找对人~孙帅
  • Spring官方文档

前言

上一篇文章的尾声,我们简要触及了“事务”这一重要概念。事务在数据库操作中扮演着至关重要的角色,确保数据的完整性与一致性。今天,我将带领大家进一步深入,系统性地探索Spring是如何进行事务管理和控制的。

事务管理在Spring框架中占据着核心的位置,它为我们提供了强大而灵活的事务控制机制,无论是声明式还是编程式。为了让大家能够从中受益,我们会从事务的基本概念开始,然后深入到Spring的事务管理策略,以及如何在实际应用中恰当地使用这些策略。

希望通过今天的深入学习,大家能够更为熟练地在Spring中操作事务,确保业务逻辑的健壮性和数据的安全性

事务处理

什么是事物?

事务是数据库管理系统中为了确保数据完整性与一致性所提供的一种关键机制。它确保了由一个或多个SQL语句组成的操作作为一个整体被执行,即要么全部成功执行,要么全部不执行。这种全体性的执行特性,保障了即使在面对系统故障或其他意外情况时,数据仍然保持一致性。

事务的四大特性,通常被称为ACID属性,具体包括:

  • 原子性 (Atomicity):原子性确保事务作为一个单一的“单位”进行操作,意味着如果事务中的某些操作失败,整个事务都将回滚,就好像从未被执行过一样。
  • 隔离性 (Isolation):多个事务并发执行时,隔离性确保每个事务在一个单独的“隔离”环境中运行,使得事务之间不会相互影响。
  • 一致性 (Consistency):一致性确保每个事务执行完后,数据库的状态从一个一致的状态转变为另一个一致的状态。
  • 持久性 (Durability):持久性保证一旦事务被提交,对数据库的更改就是永久性的,即使系统发生故障。

了解这四大特性对于理解事务的工作原理和如何在实际应用中使用事务至关重要。在使用Spring进行数据库操作时,Spring提供了强大的事务管理功能,允许开发者方便地控制和管理事务,从而确保数据操作的完整性和一致性

如何控制事务?

事务管理在数据库操作中是至关重要的,不同的框架或库为我们提供了不同的事务控制手段,但本质上,这些操作都是基于数据库连接对象Connection的。

  • JDBC:在传统的JDBC编程中,事务的控制是直接通过Connection对象来实现的。Connection.setAutoCommit(false)可以关闭自动提交,这样可以确保在明确调用commit()方法之前,所做的更改不会被提交。如果在事务中遇到错误,可以通过rollback()方法来撤回更改。这种手动控制事务的方式给予开发者很大的灵活性,但同时也带来了更多的责任,因为开发者需要确保在正确的时机提交或回滚事务。
  • MyBatis:与JDBC不同,MyBatis为开发者提供了一个更高级的抽象,即SqlSession。尽管SqlSession为我们提供了诸如commit()rollback()等方法,但实际上,这些方法的工作仍然是基于底层的Connection对象来完成的。也就是说,SqlSession只是为Connection提供了一个简化的接口,将更复杂的操作隐藏起来,为开发者提供了一个更简洁、更直观的API

这两种方式各有优缺点。直接使用Connection对象进行事务管理为开发者提供了最大的灵活性,但也需要开发者对事务有深入的理解,确保事务在正确的时机被提交或回滚。而通过SqlSession进行事务管理,虽然部分隐藏了底层细节,但为开发者提供了一个更为简单和直观的API,有助于简化代码并减少出错的机会

Spring控制事务开发

思路分析

在Spring框架中,事务管理是通过AOP技术实现的,它提供了一种高效、灵活的方法来管理事务。事务管理在Spring中的实现与我们之前在AOP中讨论的基本概念紧密相连:原始对象、额外功能、切入点和组装切面。

  1. 原始对象:在事务管理的上下文中,原始对象通常指的是业务逻辑类,如Service对象。这些对象中包含核心业务逻辑、计算和对DAO的调用。
  2. 额外功能:这是真正实现事务管理的部分。当我们调用一个业务方法时,Spring会自动开启一个新的事务。在业务逻辑执行完成之后,Spring会决定提交事务或在出现异常时回滚事务。为了完成这个任务,Spring提供了DataSourceTransactionManager类。这个类为我们处理了大部分与事务管理相关的复杂性,如事务的开启、提交和回滚等。
  3. 切入点:在Spring中,我们可以通过在方法或类上添加@Transactional注解来标识一个切入点。这告诉Spring哪些方法需要事务管理。当标注了此注解的方法被调用时,Spring会自动为其提供事务管理服务。
  4. 组装切面:在Spring的配置中,我们使用<tx:annotation-driven>标签来启用基于注解的事务管理。此标签告诉Spring去查找带有@Transactional注解的方法,并为其提供事务管理服务。为了使这一切正常工作,我们还需要提供一个DataSourceTransactionManager的引用,它会负责实际的事务管理工作

编码分析

步骤如下

  • 引入依赖
  • 开发原始业务Service类,添加注解
  • 配置文件配置
<!--Spring事务控制所需依赖-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.1.14.RELEASE</version>
</dependency>
@Transactional
public class UserServiceImpl implements UserService {private UserDAO userDAO;public UserDAO getUserDAO() {return userDAO;}public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}@Overridepublic void register(User user) {userDAO.save(user);throw new RuntimeException("测试异常");}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd"><!--此处省略内容为上一节Spring整合的内容--><!--原始对象--><bean id="userService" class="com.aomsir.basic.mybatis.service.impl.UserServiceImpl"><property name="userDAO" ref="userDAO" /></bean><!--额外功能--><bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!--组装切面--><tx:annotation-driven transaction-manager="dataSourceTransactionManager" />
</beans>
public class TestSpringTx {@Testpublic void test1() {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext3.xml");UserService userService = (UserService) ctx.getBean("userService");User user = new User();user.setName("Aomsir");user.setPassword("123456");userService.register(user);}
}

在这里插入图片描述
在这里插入图片描述

细节分析

确实,tx:annotation-driven标签的proxy-target-class属性为我们提供了一个选择代理实现的机会,进一步印证了Spring事务管理的AOP基础。

  1. JDK动态代理:当proxy-target-class属性设置为false(或未明确设置,因为默认为false)时,Spring使用JDK的动态代理来创建代理对象。JDK动态代理的主要要求是目标类必须实现一个或多个接口,因为代理类也会实现这些接口。因此,只有实现了接口的业务bean才能使用JDK动态代理。
  2. Cglib动态代理:当proxy-target-class属性设置为true时,Spring使用Cglib库创建代理对象。与JDK动态代理不同,Cglib可以为没有实现任何接口的类创建代理,因为它通过继承目标类的方式创建子类作为代理。这使得Cglib对那些未实现接口的业务bean更加有用。

选择哪种代理方式取决于具体的应用场景和需求。如果业务对象实现了接口,JDK动态代理可能是首选,因为它通常有更好的性能。但是,如果业务对象没有实现任何接口或者有某些原因需要使用Cglib,那么就可以选择Cglib动态代理。
总之,事实上Spring通过proxy-target-class属性提供了对事务管理代理方式的控制,进一步证明了其事务管理是基于AOP的实现,无论是通过JDK动态代理还是Cglib动态代理,都是遵循AOP的核心原则和概念

<!--组装切面-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="true"/>

总结

在这篇《Spring5应用之事务处理》中,我们详细探讨了Spring中事务的关键概念和实现机制。首先,我们深入理解了事务的核心特性AICD,并通过对比JDBC和MyBatis在事务处理上的实现,进一步明确了事务控制的细节和特点。重要的是,我们发现Spring通过AOP技术巧妙地进行事务管理,从而大大简化了开发者的工作。

文章强调了原始对象如何与额外功能相结合,以及如何通过特定的注解和配置实现事务控制。特别是通过深入研究tx:annotation-driven标签,我们进一步了解了Spring在事务处理背后的AOP实现机制,如何选择不同的代理方法来达到我们的需求。

总而言之,本文为我们提供了一个全面、系统的视角,看待Spring在事务处理上的优越性和实现方法,帮助我们更加自信地在实际开发中应用Spring进行事务管理

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

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

相关文章

ant-design-vue 实现表格表头纵排列

结果如图&#xff1a; 区域&#xff0c;成功率&#xff0c;清单率为表头&#xff0c;右侧为动态的数据 废话不多说直接上代码&#xff1a; 1.先声明表格&#xff0c;使用框架自带a-table&#xff0c;核心点就在data和columns上 <div style"margin-bottom: 60px;"…

jvm--执行引擎

文章目录 1. 执行引擎的工作流程2. 解释器、JIT及时编译器3. 热点代码及探测技术4. HotSpotVM 中 JIT 分类 执行引擎属于 JVM 的下层&#xff0c;里面包括解释器、及时编译器、垃圾回收器 JVM 的主要任务是负责 装载字节码到其内部&#xff0c;但字节码并不能够直接运行在操作…

C之fopen/fclose/fread/fwrite/flseek

一、C中文件操作简介 c中的文件操作大致和linux的文件操作类似&#xff0c;但是毕竟是不同的API&#xff0c;所以会有些差异。部分差异会在下面的案例中体验 二、fopen open的参数有两个一个是文件名&#xff0c;一个是模式选择&#xff0c;不同open函数&#xff0c;open中的模…

Jmeter 分布式压测,你的系统能否承受高负载?

‍你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子&#xff0c;它模拟了同时有 5000 个用户&#xff0c;循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 ​结果分析 ​但是&#xff0c;实际企业中&#xff0c;这种压测方式根本不满足实际需求。下…

HSRP热备份路由器协议的解析和配置

HSRP的解析 个人简介 HSRP hot standby router protocol 热备份路由协议&#xff08;思科私有协议&#xff09; HSRP v1 version 1 HSRP v2 version 2 虚拟一个HSRP虚拟IP地址 192.168.1.1 开启HSRP的抢占功能 通过其他参数 人为调整谁是主 谁是从 &#xff01; 查…

firefox的主题文件位置在哪?记录以防遗忘

这篇文章写点轻松的 最近找到了一个自己喜欢的firefox主题,很想把主题的背景图片找到,所以找了下主题文件所在位置 我的firefox版本:版本: 118.0.1 (64 位)主题名称: Sora Kawai 我的位置在 C:\Users\mizuhokaga\AppData\Roaming\Mozilla\Firefox\Profiles\w0e4e24v.default…

写爬虫?前端er何必用python

前言 说起网络爬虫,很多人第一时间想到python,但爬虫并非只能用python实现,虽然网上大部分爬虫文章都在说python爬虫,但对于前端程序员来说,我觉得js才是最屌的(对于简单爬取任务来说,复杂的我暂时没碰到~),下面说说我的经验(是的,仅限本人经验),希望能给各位前…

Linux系统管理:虚拟机Centos Stream 9安装

目录 一、理论 1.Centos Stream 9 二、实验 1.虚拟机Centos Stream 9安装准备阶段 2.安装Centos Stream 9 3.进入系统 一、理论 1.Centos Stream 9 (1) 简介 CentOS Stream 是一种 Linux 操作系统。安装此操作系统的难题在于&#xff0c;在安装此系统之前&#xff0c…

光伏发电预测(GRU模型,Python代码)

运行效果&#xff1a;光伏发电预测&#xff08;GRU模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 所有库的版本&#xff1a; 1.数据集&#xff08;连续10年不间断采集三个光伏电站的发电量及天气情况&#xff0c;每隔半个小时采集一次信息&#xff0c;因此&…

MPP 架构在 OLAP 数据库的运用

MPP 架构&#xff1a; MPP 架构的产品&#xff1a; Impala ClickHouse Druid Doris 很多 OLAP 引擎都采用了 MPP 架构 批处理系统 - 使用场景分钟级、小时级以上的任务&#xff0c;目前很多大型互联网公司都大规模运行这样的系统&#xff0c;稳定可靠&#xff0c;低成本。…

污水管网水位监测,管网水位监测仪守护城市污水管网运行

万宾科技&#xff1a;污水管网水位监测 近年来&#xff0c;城市化进程的加速使得污水管网建设愈发重要。然而&#xff0c;在管网运维中&#xff0c;水位监测一直以来都是一个令人头痛的难题。为了解决这一问题&#xff0c;万宾科技公司推出了管网水位监测仪EN200-D2&#xff0…

基于 ACK Fluid 的混合云优化数据访问(三):加速第三方存储的读访问,降本增效并行

作者&#xff1a;车漾 前文回顾&#xff1a; 本系列将介绍如何基于 ACK Fluid 支持和优化混合云的数据访问场景&#xff0c;相关文章请参考&#xff1a; 基于 ACK Fluid 的混合云优化数据访问&#xff08;一&#xff09;&#xff1a;场景与架构 基于 ACK Fluid 的混合云优化…

Java-Atomic原子操作类详解及源码分析,Java原子操作类进阶,LongAdder源码分析

文章目录 一、Java原子操作类概述1、什么是原子操作类2、为什么要用原子操作类3、CAS入门 二、基本类型原子类1、概述2、代码实例 三、数组类型原子类1、概述2、代码实例 四、引用类型原子类1、概述2、AtomicReference3、ABA问题与AtomicStampedReference4、一次性修改&#xf…

功率半导体器件静态参数测试都测哪些内容?

功率半导体器件如今已成为不可或缺的元件&#xff0c;在通信、电力电子等领域得到广泛应用。而对其性能参数的测试也是必不可少的&#xff0c;是对半导体性能、质量的保障。半导体测试参数包含静态测试参数和动态测试参数&#xff0c;本文将介绍半导体分立器件静态测试参数的相…

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习Access数据库的 sql注入)

一&#xff0c;资源下载 百度网盘资源下载链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

Android Studio Flutter真机调试错误

错误&#xff1a;Could not locate aapt. Please ensure you have the Android buildtools installed. No application found for TargetPlatform.android_arm64. Is your project missing an android/app/src/main/AndroidManifest.xml? Consider running "flutter crea…

京东运营数据分析:2023年8月京东饮料行业品牌销售排行榜

鲸参谋监测的京东平台8月份饮料市场销售数据已出炉&#xff01; 8月份&#xff0c;饮料市场整体销售下滑。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年8月&#xff0c;京东平台饮料市场的总销量将近820万&#xff0c;环比下滑约8%&#xff0c;同比下滑约20%&am…

Docker与Serverless计算的集成: Docker容器如何与Serverless计算结合。

文章目录 1. Docker容器的可移植性2. Serverless计算的自动伸缩性3. 使用Serverless与Docker容器a. 自托管Serverless平台b. 使用容器服务 4. 使用案例&#xff1a;图像处理服务5. 结论 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;…

flex布局在多层嵌套时,内层设置了justify-content: space-between;不生效问题

内层的地址和时间这一行&#xff0c;设置了justify-content: space-between;但并不生效&#xff0c;原因是要在上一层.center 设置 flex:1;&#xff08; 重点&#xff09; 经常忘记&#xff0c;特在此记录一下&#xff0c;以下是代码 <view class"index-card" c…

3D 人体研究

SynBody: Synthetic Dataset with Layered Human Models for 3D Human Perception and Modeling SynBody 是一个新的合成数据集&#xff0c;旨在推动 3D 人体研究的多样性和标注质量。它具有以下三个吸引人的特点&#xff1a; 服装参数化人体模型&#xff1a;可以生成各种不同…