Spring事务控制

news2024/12/27 11:30:41

目录

1、什么是事务控制

2、编程式事务控制

2.1、简介

2.2、相关对象

2.2.1、PlatformTransactionManager

2.2.2、TransactionDefinition

2.2.2.1、事务隔离级别

2.2.2.2、事务传播行为

2.2.3、TransactionStatus

3、声明式事务控制

3.1、简介

3.2、区别

3.3、⭐作用

3.4、🔺基于xml

3.4.1、引入tx命名空间

3.4.2、配置事务增强

3.4.3、配置事务AOP织入

3.4.4、测试业务代码

3.4.5、⭐🔺切点方法配置

3.5、🔺基于注解

3.5.1、配置组件扫描和注解驱动

3.5.2、注解替代

3.5.3、@Transactional

3.5.4、注意事项


1、什么是事务控制

Spring 提供了强大的事务管理支持,可以帮助你在应用程序中管理数据库操作的事务。事务是一组数据库操作,要么全部成功执行,要么全部失败回滚,以保持数据的一致性和完整性。Spring 的事务管理可以通过编程式或声明式的方式来实现。

以下是 Spring 事务控制的一些关键概念和介绍:

  1. 事务管理器(Transaction Manager): 事务管理器是 Spring 框架用来管理事务的核心组件。它负责启动、提交和回滚事务,以确保一组操作的原子性和一致性。
  2. 编程式事务管理: 在编程式事务管理中,开发人员手动编写代码来控制事务的开始、提交和回滚。这种方式灵活,但可能导致代码与事务管理的耦合。
  3. 声明式事务管理: 声明式事务管理通过使用 AOP 技术将事务逻辑从业务逻辑中分离出来,以声明的方式来定义事务的行为。通常使用基于注解或 XML 配置来实现。
  4. 事务传播行为(Propagation): 事务传播行为定义了一个方法调用在一个已经存在的事务中执行时,应该如何处理事务。例如,REQUIRED 表示方法必须在事务中执行,REQUIRES_NEW 表示方法将创建一个新事务。
  5. 事务隔离级别(Isolation Level): 事务隔离级别定义了多个事务之间的隔离程度,以防止并发访问数据库时的数据不一致问题。常见的隔离级别有 READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE。
  6. 事务超时(Timeout): 事务超时设置了一个时间限制,在指定时间内事务必须完成,否则将被自动回滚。
  7. 只读事务(Read-Only Transactions): 只读事务标记了在事务期间不会修改数据的操作,这可以优化性能。
  8. 回滚规则(Rollback Rules): 回滚规则定义了在哪些异常发生时事务应该回滚。
  9. 声明式事务管理的配置: 通过 Spring 的 XML 配置或注解,你可以定义事务管理器、事务属性、切点等,从而实现声明式事务管理。
  10. @Transactional 注解: Spring 提供了 @Transactional 注解,可以将其应用到方法上,实现声明式事务管理。你可以在方法上使用该注解来指定事务的传播行为、隔离级别等属性。

使用 Spring 的事务管理,你可以轻松地处理事务,保证数据的一致性和完整性,同时降低代码的耦合度。无论是编程式事务管理还是声明式事务管理,Spring 都提供了丰富的支持和灵活的配置方式。

2、编程式事务控制

2.1、简介

编程式事务控制是一种通过在代码中显式编写事务管理代码来管理事务的方法。在这种方式下,开发人员直接在代码中控制事务的开始、提交和回滚,以确保一组操作的原子性和一致性。虽然相对于声明式事务管理而言,编程式事务管理可能更为繁琐,但它提供了更大的灵活性和细粒度的控制。

以下是编程式事务控制的关键要点:

  1. 事务管理器(Transaction Manager): 编程式事务控制仍然需要使用事务管理器来协调和管理事务。事务管理器负责处理底层数据库连接以及事务的开始、提交和回滚。
  2. 编写事务管理代码: 在需要进行事务管理的方法中,开发人员需要编写代码来显式地控制事务的开始、提交和回滚。通常,你需要获取事务管理器的句柄,并使用它来开启和提交事务。
  3. 事务操作流程: 编程式事务控制的典型操作流程包括:
    • 获取事务管理器的句柄。
    • 调用事务管理器的 getTransaction 方法获取事务对象。
    • 通过事务对象的方法来控制事务的开始、提交和回滚。
    • 在事务处理过程中捕获可能出现的异常,并根据情况进行回滚。
  1. 细粒度控制: 编程式事务管理允许你对每个方法或方法中的一部分代码进行细粒度的事务控制。这对于需要灵活控制事务的特定业务场景非常有用。
  2. 适用场景: 编程式事务控制适用于需要复杂事务逻辑、嵌套事务、或者需要根据条件来动态控制事务的情况。它也可以用于需要精细控制事务边界的情况。

尽管编程式事务控制在某些情况下可以提供更大的灵活性,但它通常会导致代码与事务管理的耦合增加,同时也增加了代码的复杂性。

与之相比,声明式事务管理通过 AOP 技术将事务管理逻辑从业务代码中解耦,提供了更清晰和简洁的事务管理方式。选择编程式还是声明式事务控制取决于项目需求和复杂性。

2.2、相关对象

对于编程式事务控制,重点要了解的是编程式事务控制的相关对象。

相关对象

描述

PlatformTransactionManager

事务管理器,负责管理事务的启动、提交和回滚。

TransactionDefinition

定义事务的属性,如传播行为、隔离级别、超时等。

TransactionStatus

表示事务的当前状态,包括活动、提交、回滚等。

TransactionTemplate

Spring 提供的工具类,用于简化编程式事务控制的使用。

2.2.1、PlatformTransactionManager

PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

方法

说明

TransactionStatus

getTransaction(TransactionDefination defination)

获取事务的状态信息

void commit(TransactionStatus status)

提交事务

void rollback(TransactionStatus status)

回滚事务

注意:

PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类,例如:Dao 层技术是jdbc 或 mybatis 时:org.springframework.jdbc.datasource.DataSourceTransactionManager

Dao 层技术是hibernate时:org.springframework.orm.hibernate5.HibernateTransactionManager

2.2.2、TransactionDefinition

TransactionDefinition 是事务的定义信息对象,里面有如下方法:

方法

说明

int getIsolationLevel()

获得事务的隔离级别

int getPropogationBehavior()

获得事务的传播行为

int getTimeout()

获得超时时间

boolean isReadOnly()

是否只读

2.2.2.1、事务隔离级别

设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。

ISOLATION_DEFAULT

ISOLATION_READ_UNCOMMITTED

ISOLATION_READ_COMMITTED

ISOLATION_REPEATABLE_READ

ISOLATION_SERIALIZABLE

这里介绍一下不同的事务隔离级别:

  1. ISOLATION_DEFAULT(默认隔离级别): 使用数据库默认的隔离级别。具体隔离级别取决于底层数据库的默认设置。
  2. ISOLATION_READ_UNCOMMITTED(读未提交): 允许事务读取其他未提交事务的数据。这可能会导致脏读、不可重复读和幻读问题。
  3. ISOLATION_READ_COMMITTED(读已提交): 保证事务只能读取已经提交的数据。可以防止脏读,但可能会导致不可重复读和幻读问题。
  4. ISOLATION_REPEATABLE_READ(可重复读): 保证在事务执行期间,多次读取同一数据会得到相同的结果。可以防止脏读和不可重复读,但可能会导致幻读问题。
  5. ISOLATION_SERIALIZABLE(串行化): 最高的隔离级别,确保事务彼此完全隔离,不会出现脏读、不可重复读和幻读问题。但是并发性能较差,因为它会限制并发访问数据库。

事务隔离级别决定了在并发事务执行时,一个事务能否看到其他事务的未提交数据以及如何处理数据的一致性问题。不同的隔离级别提供了不同的权衡,可以根据应用程序的需求来选择适当的隔离级别。需要注意的是,更高的隔离级别通常会增加数据库的锁竞争,可能会影响并发性能。

2.2.2.2、事务传播行为

REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)

SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常

REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

NEVER:以非事务方式运行,如果当前存在事务,抛出异常

NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作

超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置

是否只读:建议查询时设置为只读

2.2.3、TransactionStatus

TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。

方法

说明

boolean hasSavepoint()

是否存储回滚点

boolean isCompleted()

事务是否完成

boolean isNewTransaction()

是否是新事务

boolean isRollbackOnly()

事务是否回滚

3、声明式事务控制

3.1、简介

声明式事务控制是一种使用元数据(例如注解或 XML 配置)来定义事务的行为,从而将事务管理逻辑从业务代码中分离出来的方法。

在声明式事务控制中,开发人员不需要显式编写事务管理代码,而是通过配置来指定事务的属性,如传播行为、隔离级别、超时等。Spring 框架负责根据配置来自动管理事务的启动、提交和回滚。

与之相反,编程式事务控制是通过在代码中显式编写事务管理代码来管理事务的方法。在编程式事务控制中,开发人员需要调用事务管理器的方法来开启、提交和回滚事务,以及处理异常情况。

3.2、区别

以下是声明式事务控制与编程式事务控制之间的主要区别:

  1. 代码分离:
    • 声明式事务控制:事务管理逻辑与业务逻辑分离,通过配置元数据实现,业务代码不涉及事务管理。
    • 编程式事务控制:事务管理逻辑与业务逻辑混合在一起,需要在业务代码中显式编写事务管理代码。
  1. 灵活性和复杂性:
    • 声明式事务控制:提供了更高的灵活性,可以在配置中更改事务属性,而无需更改业务代码。适用于大多数常见的事务场景。
    • 编程式事务控制:更灵活的控制,但可能导致代码与事务管理的紧耦合,增加代码复杂性。
  1. 可读性和维护性:
    • 声明式事务控制:提高了代码的可读性和维护性,事务管理逻辑集中在配置中,业务逻辑更清晰。
    • 编程式事务控制:可能导致代码重复,增加了代码的冗余度。
  1. 适用场景:
    • 声明式事务控制:适用于大多数常见的事务场景,可以简化事务管理,减少冗余代码。
    • 编程式事务控制:适用于需要更细粒度控制事务、嵌套事务、动态事务等复杂场景。

总之,声明式事务控制通过将事务管理逻辑从业务代码中分离出来,提供了更加清晰、可维护的事务管理方式。编程式事务控制更加灵活,但可能会导致代码复杂性增加。选择何种方式取决于项目需求和开发团队的偏好。

3.3、⭐作用

声明式事务处理的作用:

事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可

②在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便

注意:Spring 声明式事务控制底层就是AOP。

下面分别对XML和注解进行分析,这是在“ATM转账业务”的基础上进行业务模拟。

首先是要创建实体类,然后创建对应的数据库表单,然后创建多层包:controller、service、dao、domain,最后是编写各个层的接口方法和实现方法,具体如下:

下面开始对事务控制代码进行配置,分别对XML和注解进行分析:

3.4、🔺基于xml

实现步骤:

① 引入tx命名空间

② 配置事务增强

③ 配置事务 AOP 织入

④ 测试事务控制转账业务代码

3.4.1、引入tx命名空间

3.4.2、配置事务增强

3.4.3、配置事务AOP织入

3.4.4、测试业务代码

在业务层方法中手动制造异常,如果发现数据库表单中的数据没有变化,则说明xml配置事务控制成功了。

3.4.5、⭐🔺切点方法配置

切点方法的事务参数的配置,主要就是对事务增强的配置:

其中,<tx:method> 代表切点方法的事务参数的配置,例如:

<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>

参数如下:

name:切点方法名称

isolation:事务的隔离级别

propogation:事务的传播行为

timeout:超时时间

read-only:是否只读

3.5、🔺基于注解

注解和xml配置的最大不同在于,注解使用@Transactional替换掉了xml配置中的配置增强通知和配置织入的步骤,即:

3.5.1、配置组件扫描和注解驱动

3.5.2、注解替代

在各个类上配置上对应的注解,用于替代之前使用xml配置的各种bean。

3.5.3、@Transactional

在业务层的方法上面添加@Transactional,可配置参数也可不配:

3.5.4、注意事项

① 使用 @Transactional 在需要进行事务控制的类或是方法上修饰,注解可用的属性同 xml 配置方式,例如隔离级别、传播行为等。

② 注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。

③ 使用在方法上,不同的方法可以采用不同的事务参数配置。

④ Xml配置文件中要开启事务的注解驱动<tx:annotation-driven />

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

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

相关文章

Unity实现异步加载场景

一&#xff1a;创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel,取名为LoadScreen,再在loadScreen下面创建一个Image组件&#xff0c;放置背景图片&#xff0c;然后我们再在lpadScreen下面继续创建一个Slider,这个是用来加载进度条的&#xff0c;我们改名为LoadSlid…

【考研数学】概率论与数理统计 | 第一章——随机事件与概率(1)

文章目录 一、随机试验与随机事件1.1 随机试验1.2 样本空间1.3 随机事件 二、事件的运算与关系2.1 事件的运算2.2 事件的关系2.3 事件运算的性质 三、概率的公理化定义与概率的基本性质3.1 概率的公理化定义3.2 概率的基本性质 写在最后 一、随机试验与随机事件 1.1 随机试验 …

Docker-使用数据卷、文件挂载进行数据存储与共享

一、前言 默认情况下&#xff0c;在Docker容器内创建的所有文件都只能在容器内部使用。容器删除后&#xff0c;数据也跟着删除&#xff0c;虽然通常我们不会删除容器&#xff0c;但是一旦宿主机发生故障&#xff0c;我们重新创建容器恢复服务&#xff0c;那么之前容器创建的文…

Matlab图坐标轴数值负号改为减号(change the hyphen (-) into minus sign (−, “U+2212”))

在MATLAB中&#xff0c;坐标轴负数默认符号是 - &#xff0c;如下图所示 x 1:1:50; y sin(x); plot(x,y)可通过以下两语句将负号修改为减号&#xff1a; set(gca,defaultAxesTickLabelInterpreter,latex); yticklabels(strrep(yticklabels,-,$-$));或者 set(gca, TickLabe…

安装mmcv失败

安装mmcv时报错 pip install mmcv这里只需要按照提示升级一下pip就可以了 pip install --upgrade pip然后安装成功

OCT介绍和分类

前言&#xff1a;研究方向和OCT有关&#xff0c;为了方便以后回顾&#xff0c;所以整理了OCT相关的一些内容。 OCT介绍和分类 OCT介绍分类时域OCT频域OCT扫频OCT谱域OCT OCT介绍 名称&#xff1a;OCT、光学相干层析成像术、Optical Coherence Tomography。 概念&#xff1a;O…

添加vue devtools扩展工具+添加后F12不显示Vue图标

前言&#xff1a;在开启Vue学习之旅时&#xff0c;遇到问题两个问题&#xff0c;第一添加不上vue devtools扩展工具&#xff0c;第二添加完成后&#xff0c;F12不显示Vue图标。查阅了很多博客&#xff0c;自己解决了问题&#xff0c;故写此博客记录。如果你遇到和我一样的问题&…

Docker容器与虚拟化技术:Docker架构、镜像管理

目录 一、理论 1.Doker概述 2.Docker核心概念 3.Docker安装 4.Docker的镜像管理命令 二、实验 1.Docker安装 2.查看Docker信息 3.Docker的镜像管理命令 三、问题 1.如何注册Docker账号 2.如何设置Docker公共存储库 四、总结 一、理论 1.Doker概述 (1) IT架构 裸…

request发送http请求

今天正式开始为大家介绍接口自动化&#xff0c;相信很多做测试的朋友&#xff0c;都用过一些工具&#xff0c;比如jmeter&#xff0c;loadrunner&#xff0c;postman等等&#xff0c;所以今天先给那些基础不太好的同学&#xff0c;先讲讲postman如何来测接口以及如何用pthon代码…

T113-S3 Tina-Linux -- 2.开发板使用

1. 硬件环境 1.1 开发板 型号&#xff1a;100ASK_T113-PRO Base V1.1&#xff08;韦东山&#xff09;配置&#xff1a;CPU&#xff1a;T113-S3&#xff0c;RAM&#xff1a;128MB&#xff0c;ROM&#xff1a;128MB 2. 各模块使用 2.1 wifi wifi模组型号&#xff1a;XR829…

数学建模(三)整数规划

视频推荐&#xff1a;B站_数学建模老哥 一、整数规划基本原理 数学规划中的变量&#xff08;部分或全部&#xff09;限制为整数时&#xff0c;称为整数规划。若在线性规划模型中&#xff0c;变量限制为整数&#xff0c;则称为整数线性规划。目前所流行的求解整数规划的方法&am…

C语言刷题训练【第11天】

大家好&#xff0c;我是纪宁。 今天是C语言笔试刷题训练的第11天&#xff0c;加油&#xff01; 文章目录 1、声明以下变量&#xff0c;则表达式: ch/i (f*d – i) 的结果类型为&#xff08; &#xff09;2、关于代码的说法正确的是&#xff08; &#xff09;3、已知有如下各变…

微PE工具箱实现U盘重装Windows系统

教程来源 U盘重装Windows系统&#xff08;微PE工具箱&#xff09;_哔哩哔哩_bilibili 加上自己的一丢丢理解&#xff0c;如果你觉得长视频看了犯困&#xff0c;不如看看我的理解文章说不定能够帮助到你 准备工作 到这个网站使用迅雷下载免费无插件的官方镜像MSDN, 我告诉你…

DAY05_SpringMVC—SSM整合表现层数据封装异常处理器项目异常处理方案SSM整合页面开发拦截器

目录 一 SSM整合1 SSM整合配置问题导入1.1 SSM整合流程1.2 SSM整合配置1.2.1 创建工程&#xff0c;添加依赖和插件1.2.2 Spring整合Mybatis1.2.3 Spring整合SpringMVC 2 功能模块开发2.1 数据层开发(BookDao)2.2 业务层开发(BookService/BookServiceImpl)2.3 表现层开发(BookCo…

vue+flask基于知识图谱的抑郁症问答系统

vueflask基于知识图谱的抑郁症问答系统 抑郁症已经成为当今社会刻不容缓需要解决的问题&#xff0c;抑郁症的危害主要有以下几种&#xff1a;1.可导致病人情绪低落&#xff1a;抑郁症的病人长期处于悲观的状态中&#xff0c;感觉不到快乐&#xff0c;总是高兴不起来。2.可导致工…

VSCode使用SSH无密码连接Ubuntu

VSCode使用SSH无密码连接Ubuntu 前提条件&#xff1a; 1. 能够正常使用vscode的Remote-ssh连接Ubuntu 2. Ubuntu配置静态ip&#xff08;否则经常需要修改Remote-ssh的配置文件里的IP&#xff09; 1. windows下 打开Win下的PowerShell&#xff0c;生成公钥和私钥 ssh-keygen…

VScode如何设置中文教程

前言&#xff1a;打开VSCode软件&#xff0c;可以看到刚刚安装的VSCode软件默认使用的是英文语言环境&#xff0c;但网上都是vscode中文界面教你怎么设置中文&#xff0c;可能不利于小白阅读&#xff0c;所以重装vscode&#xff0c;手摸手从英文变成中文。 设置为中文 打开VS…

【Microsoft 支持】【数据库-MySql】当您尝试从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)

​ 一、转载原文 When you try to connect from TCP ports greater than 5000 you receive the error ‘WSAENOBUFS (10055)’ Symptoms If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAE…

突然让做性能测试?试试RunnerGo

当前&#xff0c;性能测试已经是一名软件测试工程师必须要了解&#xff0c;甚至熟练使用的一项技能了&#xff0c;在工作时可能每次发版都要跑一遍性能&#xff0c;跑一遍自动化。性能测试入门容易&#xff0c;深入则需要太多的知识量&#xff0c;今天这篇文章给大家带来&#…