006 spring事务支持

news2025/1/11 10:05:42

文章目录

    • 事务回顾
      • 事务介绍
      • 事务并发问题(隔离性导致)
      • 事务隔离级别
    • Spring框架事务管理相关接口
    • Spring框架事务管理的分类
      • 编程式事务管理(了解)
      • 声明式事务管理(重点)
    • 事务管理之XML方式
      • 业务层
      • 持久层
      • 单元测试代码
      • 配置事务管理的AOP
    • 事务管理之混合方式
    • 事务管理之基于AspectJ的纯注解方式

事务回顾

事务介绍

事务:指的是逻辑上一组操作,组成这个事务的各个执行单元,要么一起成功,要么一起失败
事务的特性(ACID):

  • 原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚

  • 一致性(Consistency)

一致性是指事务必须使数据库一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还是5000,这就是事务的一致性

  • 隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

  • 持久性

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

事务并发问题(隔离性导致)

在事务的并发操作中可能会出现一些问题

  • 脏读:一个事务读取到另一个事务未提交的数据
  • 不可重复读:一个事务因读取到另一个事务已提交的数据。导致对同一条记录读取两次以上的结果不一致
  • 幻读:一个事务因读取到另一个事务已提交的数据。导致对同一张表读取两次以上的结果不一致。insert、delete操作

事务隔离级别

为了避免上面出现的几种情况,在标注SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同

  • 四种隔离级别:
    现在来看看MySQL数据库为我们提供的四种隔离级别(由低到高):
  1. Read uncommitted(读未提交):最低级别,任何情况都无法保证
  2. Read committed(读已提交):可避免脏读的发生
  3. Repeatable read(可重复读):可避免脏读、不可重复读的发生
  4. Serializable(串行化):可避免脏读、不可重复读、幻读的发生
  • 默认隔离级别
    大多数数据库的默认隔离级别是Read Committed(RC),比如Oracle、DB2等。
    MySQL数据库的默认隔离级别是Repeatable Read(RR)

  • 注意事项

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大

对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Comitted。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制

Spring框架事务管理相关接口

Spring并不直接管理事务,而是提供了事务管理接口是PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了
在这里插入图片描述

1.PlatformTransactionManager接口 – 平台事务管理器(真正管理事务的类)。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类
2.TransactionDefinition接口 – 事务定义信息(事务的隔离级别,传播行为,超时,只读)
3.TransactionStatus接口 --事务的状态(是否新事务、是否已提交、是否有保存点、是否回滚)
4.总结:上述对象之间的关系:平台事务管理器真正管理事务对象 根据事务定义的信息TransactionDefinition进行事务管理,在管理事务中产生一些状态 将状态记录到TransactionStatus中
5.PlatformTransactionManager接口中实现类和常用的方法

1.接口的实现类
如果使用的Spring的JDBC模板或者MyBatis(IBatis)框架,需要选择DataSourceTransactionManager实现类
如果使用的是Hibernate的框架,需要选择HibernateTransactionManager实现类

2.该接口的常用方法
void commit(TransactionStatus status)
TransactionStatus getTransaction(TransactionDefinition definition)
void rollback(TransactionStatus status)

6.TransactionDefinition

1.事务隔离级别的常量
static int ISOLATION_DEFAULT --采用数据库的默认隔离级别
static int ISOLATION_READ_UNCOMMITTED
static int ISOLATION_READ_COMMITTED
static int ISOLATION_REPEATABLE_READ
static int ISOLATION_SERIALIZABLE

2.事务的传播行为常量(不用设置,使用默认值)
先解释什么是事务的传播行为:解决的是业务层之间的方法调用
PROPAGATION_REQUIRED(默认值) – A中有事务,使用A中的事务。如果没有,B就会开启一个新的事务,将A包含进来。(保证A,B在同一个事务中),默认值
PROPAGATION_SUPPORTS – A中有事务,使用A中的事务。如果A中没有事务,那么B也不使用事务。
PROPAGATION_MANDATOTY – A中有事务,使用A中的事务。如果A没有事务,抛出异常
PROPAGATION_REQUIRES_NEW – A中有事务,将A中的事务挂起。B创建一个新的事务(保证A,B没有在一个事务中)
PROPAGATION_NOT_SUPPORTED – A中有事务,将A中的事务挂起
PROPAGATION_NEVER --A中有事务,抛出异常
PROPAGATION_NESTED --嵌套事务。当A执行之后,就会在这个位置设置一个保存点。如果B没有问题,执行通过。如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者最初始状态)

Spring框架事务管理的分类

1.Spring的编程式事务管理(不推荐使用)

通过手动编写代码的方式完成事务的管理(不推荐)

2.Spring的声明式事务管理(底层采用AOP的技术)

通过一段配置的方式完成事务的管理

编程式事务管理(了解)

说明:Spring为了简化事务管理的代码:提供了模板类TransactionTemplate,所以手动编程的方式来管理事务,只需要使用该模板类即可
手动编程方式的具体步骤如下:
1.步骤一:配置一个事务管理器,Spring使用PlatformTransactionManager接口来管理事务,所以需要使用到他的实现类

<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>

2.步骤二:配置事务管理的模板

<!--配置事务管理的模板-->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
	<property name="transactionManager" ref="transactionManager"/>
</bean>

3.步骤三:在需要进行事务管理的类中,注入事务管理的模板

<bean id="accountService" class="com.spring.service.AccountServiceImpl">
	<property name="accountDao" ref="accountDao"/>
	<property name="transactionTemplate" ref="transactionTemplate" />
</bean>

4.步骤四:在业务层使用模板管理事务

//注入事务模板对象
private TransactionTemplate transactionTemplate;
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
	this.transactionTemplate = transactionTemplate;
}

public void pay(final String out, final String in, final double money) {
	transactionTemplate.execute(new TransactionCallbackWithoutResult(){
								protected void doInTransactionWithoutResult(TransactionStatus status) {
									//扣钱
									accountDao.outMoney(out,money);
									int a = 10/0;
									//加钱
									accountDao.inMoney(in,money);
								}

								});
}

声明式事务管理(重点)

声明式事务管理又分成三种方式

  • 基于AspectJ的XML方式(重点掌握)
  • 基于AspectJ的注解+XML混用方式(重点掌握)
  • 基于AspectJ的纯注解方式(重点掌握)

事务管理之XML方式

准备转账环境:

业务层

AccountService
AccountServiceImpl
public void transfer(String in, String out, double money) {
	dao.outMoney(out,money);
	//异常代码
	System.out.println(1/0);
	dao.inMoney(in,money);
}

持久层

AccountDao
AccountDaoImpl

spring配置

<!--配置数据源连接池(C3P0) -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
	<property name="driverClass" value="com.mysql.jdbc.Driver" />
	<property name="jdbcUrl" value="jdbc:mysql:///web01" />
	<property name="user" value="root" />
	<property name="password" value="root" />
</bean>

<bean class="cn.spring.dao.AccountDaoImpl">
	<property name="dataSource" ref="dataSource"></property>
</bean>

<context:component-scan base-package="cn.spring.service"></context:component-scan>

单元测试代码


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(location={"classpath:applicationContext-tx.xml"})
public class TransactionTest {
	@Autowired
	private AccountService service;
	
	@Test
	public void test01() {
		service.transfer("a","b",100);
	}
}

配置事务管理的AOP

  • 平台事务管理器:DataSourceTransactionManager
<!-- 配置平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!--注入数据源-->
	<property name="dataSource" ref="dataSource"></property>
</bean>
  • 事务通知

<tx:advice id=“” transaction-manager=“” />

<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<!-- 配置事务相关属性 -->
	<tx:attributes>
		<!-- 对方法级别设置 事务的隔离级别、事务的传播行为-->
		<!-- 设置了默认的隔离级别和传播行为-->
		<tx:method name="transfer" />
		<!-- 提交订单-->
		<tx:method name="submitOrder" />
		<!-- 添加 -->
		<tx:method name="add*" />
		<tx:method name="insert*" />
		<!-- 删除 -->
		<tx:method name="delete*" />
		<tx:method name="remove*" />
		<!-- 修改 -->
		<tx:method name="update*" />
		<tx:method name="modify*" />
		<!-- 查询 -->
		<tx:method name="find*" read-only="true" />
		<tx:method name="get*" read-only="true" />
		<tx:method name="query*" read-only="true" />
	</tx:attributes>

</tx:advice>
  • AOP配置:
<aop:config>
	<aop:advisor advice-ref="" pointcut=""/>
</aop:config>
<!--配置AOP-->
<aop:config>
	<!--切入点:所有的业务层实现类中方法-->
	<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn..service.*.*(..))"/>
	
</aop:config>

事务管理之混合方式

  • service类上或方法上加注解:

类上加@Transactional:表示该类中所有的方法都被事务管理
方法上加@Transactional:表示只有该方法被事务管理

  • 开启事务注解:
<!-- 配置平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!--注入数据源-->
	<property name="dataSource" ref="dataSource"></property>

</bean>


<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

事务管理之基于AspectJ的纯注解方式

@EnableTransactionManagement

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

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

相关文章

前沿技术丨实车测试必须注意的3个方面

在汽车网络通信中&#xff0c;ECU零部件测试、域/系统测试在测试条件上存在局限性&#xff0c;往往由于无法完全仿真工作环境、无法排除特殊干扰因素、异常场景预估不充分&#xff0c;导致在集成到整车后才新暴露出一些功能、性能、兼容性问题。 实车通信测试是作为测试验证的…

【数据分析】线性及逻辑回归模型和Python实现

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

FUANC机器人教程:速度倍率级数与倍率增量设定方法

目录 机器人速度倍率介绍 机器人运行速度倍率切换操作 快速切换速度倍率有效与无效设定 速度倍率级数与增量自定义 速度倍率级数与增量自定义举例 机器人速度倍率介绍 在机器人手动或自动运行时都离不开速度设定&#xff0c;机器人的运行速度由多个要素共同决定&#xff…

【毕业设计】Django 校园二手交易平台(有源码+mysql数据)

此项目有完整实现源码&#xff0c;有需要请联系博主 Django 校园二手交易平台开发项目 项目选择动机 本项目旨在开发一个基于Django的校园二手交易平台&#xff0c;为大学生提供一个安全便捷的二手物品买卖平台。该平台将提供用户注册和认证、物品发布和搜索、交易信息管理等…

如何使用Vue3和ApexCharts创建交互式热力图?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 热力图&#xff1a;可视化数据分布 应用场景介绍 热力图是一种数据可视化技术&#xff0c;它使用颜色来表示数据点的值。热力图常用于可视化分布数据&#xff0c;例如人口密度、温度变化或网站流量。 代码基…

视频太长了,想要剪切掉一节怎么操作?

如果你想为你的视频制作一个具有一定客观性的短视频&#xff0c;并在一些平台上发布&#xff0c;那么剪辑视频片段是不可避免的。通过剪辑视频片段的操作&#xff0c;提出视频中多余的视频内容&#xff0c;将自己需要的内容单独提取出来。但问题是如何操作它。对于新手来说&…

【分布式事务】分布式事务其他解决方案——2PC

目录 2PC解释例子分析回到IT系统中 XA 方案执行流程DTP 模型交互模式 总结 2PC 解释 2PC 即两阶段提交协议&#xff0c;是将整个事务流程分为两个阶段&#xff0c;准备阶段&#xff08;Prepare phase&#xff09;、提交阶段&#xff08;commit phase&#xff09;&#xff0c;…

探索AgentUniverse:蚂蚁集团发布的多体Agent构建工厂

在迅速发展的AI领域&#xff0c;多体智能系统因其通过协调工作处理复杂任务的能力而受到广泛关注。最近&#xff0c;蚂蚁集团发布了一款名为AgentUniverse的开源框架&#xff0c;旨在构建各种智能体&#xff0c;包括法律咨询智能体、事件解读智能体、行业分析智能体和财报生成智…

从零到一:Python自动化测试的详细指南!

引言&#xff1a; Python是一种功能强大且易于学习和使用的编程语言&#xff0c;它非常适合用于自动化测试。本文将从零开始&#xff0c;通过详细的步骤和规范&#xff0c;介绍如何在Python中实施高质量的自动化测试。我们将探讨测试策略的制定、测试框架的选择、测试用例的编…

表达式的格式化

表达式&#xff1a;一条具有明确结果的代码语句 在字符串前面加上前缀f&#xff0c;表示这是一个格式化字符串&#xff0c;可以在字符串中直接引用变量&#xff0c;并使用{}来表示这些变量的位置。例如&#xff1a; name "Alice" age 30 print(f"My name is …

30. 光纤耦合器

导论&#xff1a; 物理光学传播&#xff08;POP&#xff09;可用于计算光纤耦合效率。 设计流程&#xff1a; 光束建模和聚焦 在系统选项中选择系统孔径&#xff0c;在系统孔径下选择“入瞳直径”&#xff0c;并输入“4”。 设置0视场&#xff0c;选择角度。 加入1um波长。…

使用 Mask R-CNN 进行血细胞分割

介绍 血细胞分析是诊断各种医学疾病的重要步骤&#xff0c;从感染和贫血到更严重的疾病如白血病。传统上&#xff0c;这一过程是通过老方法进行的——实验室技术员通过显微镜查看血涂片玻片&#xff0c;花费几个小时。这一过程不仅令人乏味&#xff0c;还容易出现人为错误&…

基于Eclipse+JSP+SSH+Mysql开发的实验室设备管理系统

基于EclipseJSPSSHMysql开发的实验室设备管理系统 项目介绍&#x1f481;&#x1f3fb; 实验室教师端&#xff08;管理员端&#xff09;集成了多个核心功能模块&#xff0c;包括通知管理、预约和借用记录管理、实验室管理以及设备信息管理。管理员可以发布和删除通知公告&#…

力控算法每日一练:209. 长度最小的子数组(java)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 class Solution {public int minSu…

YOLOv10改进 | 注意力篇 | YOLOv10改进CA注意力机制

1.CA介绍 摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。 在本文中,我们通过将位置信息嵌入到通道注意力中,提出了一种新颖的移动…

为什么构造costVolume中常用逆深度采样

原因&#xff1a;在现实世界中&#xff0c;深度值分布并不均匀。距离相机较远的物体&#xff0c;其深度值变化较慢&#xff0c;而距离较近的物体&#xff0c;深度值变化较快。均匀采样可能会导致成本体积中远处的深度级别具有更多的噪声和不确定性&#xff0c;而近处的深度级别…

NLP自然语言处理课程设计—基于实体识别的智能任务系统

NLP课程设计-基于实体识别的智能任务系统 前言一、数据获取可行性分析和需求分析1. 数据获取可行性分析2. 需求分析 二、程序主要NLP技术2.1 文本分类技术2.2 中文命名实体识别2.2.1 BiLSTM&#xff08;双向长短期记忆网络&#xff09;2.2.2 CRF&#xff08;条件随机场&#xf…

MYSQL 四、mysql进阶 1(mysql逻辑架构以及查询流程)

一、mysql的逻辑架构 1. 逻辑架构剖析 1.1 服务器处理客户端请求 mysql是典型的c/s架构&#xff0c;即 client/server 架构&#xff0c;不论是客户端进程和服务器进程是采用哪种方式进行通信&#xff0c;最后实现的效果都是&#xff1a;客户端进程向服务器进程发送一段文本&am…

30天学会QT---------------大项目之在线考试系统

前段时间真的很忙很忙,忙完这段时间,总算是有空来写文章了,开始写的时候我就以为能够有时间准备和写这个,但是发现有时候忙着忙着就忘记了,没有办法来写项目,真的是非常尴尬。 现在有时间了,就有充分的时间来写了。 为了避免笔记断更,我决定先存稿来写。 1、如何规划项…

打造完美Mac多屏视界,BetterDisplay Pro一键掌控!

BetterDisplay Pro for Mac是一款专为Mac用户打造的显示器管理与优化软件&#xff0c;旨在为用户带来卓越的视觉体验和工作效率。它凭借强大的功能和简洁易用的界面&#xff0c;成为了Mac用户优化显示器设置的得力助手。 一、全方位管理与优化 BetterDisplay Pro for Mac支持…