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

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进行事务管理

相关文章:

Spring5应用之事务处理

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…...

Python 中最常用的4种股票价格移动平均方法(三)

一、简介 移动平均线是各级交易者和投资者最广泛使用的技术指标之一。它们通过计算特定时期内的平均价格来帮助消除股票价格的固有波动性。移动平均线计算起来很简单,但也有更复杂的形式,旨在捕捉市场的更多细微差别。 这个由四部分组成的系列将讨论总共 4 种不同的移动平均方…...

Mybaits缓存踩的坑

记Mybaits缓存踩的坑 1.问题提出 最近开发一个记录操作前后修改内容的功能&#xff0c;获取修改前数据比较简单&#xff0c;直接从数据库获取&#xff0c;记录修改后的功能也比较简单&#xff0c;直接将用户修改的内容封装成po对象&#xff0c;然后两个比对就可以了&#xff…...

全国工商注册数据库的作用

随着经济的发展和市场竞争的加剧&#xff0c;越来越多的人开始关注公司的工商信息。这些信息不仅可以帮助人们了解公司的基本情况&#xff0c;还可以为投资者、合作伙伴、员工等提供决策依据。 工商数据库提供了全国范围内企业的基本信息。这些信息包括企业的名称、统一社会信用…...

【Linux】NTP时间服务器Chrony配置详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…...

今年的秋招面试,确实有点难。

不可否认的是&#xff0c;今年秋招确实有点难 从今年的形势来看&#xff0c;好的 offer 都掌握在少数人的手里&#xff0c;想要秋招找到理想的工作&#xff0c;要么学历好&#xff0c;要么技术功底很扎实&#xff0c;这两样都不占的话&#xff0c;就业压力就会比较大。 如何从…...

Rn使用FlatList导航栏自动回到中间

import { useState, useRef } from react import { FlatList, View, Text, StyleSheet, TouchableOpacity } from react-nativeconst Center () > {const tabs ["语文", "数学", "英语", "政治", "历史", "地理&q…...

单例模式中的线程安全问题

小王学习录 本日鸡汤:单例模式什么是单例模式如何实现单例模式饿汉模式懒汉模式单例模式下的线程安全问题为什么在单例模式下会出现线程安全问题如何解决单例模式中的线程安全问题本日鸡汤: 志在山顶的人, 不会贪恋山腰的风景 单例模式 单例模式是设计模式中的一种, 所谓设计…...

Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图

一.背景 由于最近客户定制需要将文件挂载类型修改为sdcardfs,由于修改了文件挂载类型,导致了骁龙相机拍照后不能点击进入相册,故对骁龙相机从点击事件开始进行问题的排查,此处不介绍最终的sdcardfs挂载后的问题解决方案 二.流程介绍 拍照的流程大概分为几个阶段:打开相机…...

Docker 的网络与数据管理

Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿主机…...

在QGIS中给矢量数据属性编号的一种方法

目录 写在文章前 一、给要素编号用哪些功能 二、实现一个最简单的编号 1.数据准备 2.编辑字段计算器表达式 3.查看编号结果 三、更加复杂的编号 1.使用UUID编号 2.根据单个属性排序后编号 3.根据多个属性排序后编号 4.拼接字符串进行编号 5.根据时间编号及实现 写在…...

对一个变速器原理的分析

背景 原本是朋友在调试一个看起来比较新的变速器驱动&#xff0c;整体来说支持两种变速模式&#xff0c;一种是进程级&#xff0c;这种用了HOOK&#xff0c;中规中矩的实现&#xff0c;原理网上都有。另一种是”系统级内核全局变速“&#xff0c;这个模式初步看了下有些特殊&a…...

秒验:可以自定义UI的一键登录服务

一键登录如今成为越来越多移动应用的首选&#xff0c;但千篇一律的登陆界面在引发用户担忧其安全性的同时&#xff0c;也容易让用户在不同APP切换时产生误解。因此&#xff0c;由国内知名移动应用开发服务商MobTech打造的一键登录工具——秒验&#xff0c;通过允许开发者自定义…...

pmm最新版本v2.40.0尝鲜体验

1 概述 PMM 是一款免费开源的企业级的数据库监控工具&#xff0c;可用来监控 MySQL、MongoDB 和 PostgreSQL 等数据库。除了指标监控&#xff0c;针对MySQL还具备SQL语句的性能监控。 官方地址是https://docs.percona.com/percona-monitoring-and-management&#xff0c;最新版…...

2023年中国数据存储市场现状及发展前景预测分析

中商情报网讯&#xff1a;当前&#xff0c;新一代信息技术快速发展推动信息产业发生了重大变革&#xff0c;数据存储行业将很快成为信息领域一个重要的产业分支。生成式人工智能催生算力需求&#xff0c;各种新兴应用场景对数据存储的容量、效率、流动性和安全性等方面提出了更…...

xlsx冻结单元格

说明 因为最近需要实现前端导出 excel 文件&#xff0c;并且对导出文件的样式进行一些修改&#xff0c;比如颜色、字体、合并单元格等&#xff0c;所以我找到了xlsx-style这个项目&#xff0c;它可以对导出的 excel 文件进行一些样式上的修改&#xff0c;这个项目是SheetJs的一…...

yolov8剪枝实践

本文使用的剪枝库是torch-pruning &#xff0c;实验了该库的三个剪枝算法GroupNormPruner、BNScalePruner和GrowingRegPruner。 安装使用 安装依赖库 pip install torch-pruning 把 https://github.com/VainF/Torch-Pruning/blob/master/examples/yolov8/yolov8_pruning.py&…...

功能基础篇6——系统接口,操作系统与解释器系统

系统 os Python标准库&#xff0c;os模块提供Python与多种操作系统交互的接口 import os import stat# 文件夹 print(os.mkdir(r./dir)) # None 新建单级空文件夹 print(os.rmdir(r./dir)) # None 删除单级空文件夹 print(os.makedirs(r.\dir\dir\dir)) # None 递归创建空…...

由于导线材质不同绕组直流电阻不平衡率超标

实测证明&#xff0c; 有的变压器绕组的直流电阻偏大&#xff0c; 有的偏差较大&#xff0c; 其主要原因是某些导线的铜和银的含量低于国家标准规定限额。 有时即使采用合格的导线&#xff0c; 但由于导线截面尺寸偏差不同&#xff0c; 也可以导致绕组直流电阻不平衡率超标。  …...

选择智慧公厕解决方案,开创智慧城市公共厕所新时代

在城市建设和发展中&#xff0c;公厕作为一个不可或缺的城市基础设施&#xff0c;直接关系到城市形象的提升和居民生活品质的改善。然而&#xff0c;传统的公厕存在着管理不便、卫生状况差、设施陈旧等问题。为了解决这些困扰着城市发展的难题&#xff0c;智慧公厕源头厂家广州…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...