006 spring事务支持

文章目录

    • 事务回顾
      • 事务介绍
      • 事务并发问题(隔离性导致)
      • 事务隔离级别
    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

PyMuPDF 操作手册 - 01 从PDF中提取文本

文章目录 一、打开文件二、从 PDF 中提取文本2.1 文本基础操作2.2 文本进阶操作2.2.1 从任何文档中提取文本2.2.2 如何将文本提取为 Markdown2.2.3 如何从页面中提取键值对2.2.4 如何从矩形中提取文本2.2.5 如何以自然阅读顺序提取文本2.2.6 如何从文档中提取表格内容2.2.6.1 提…

经典sql

一、连续登录问题 问题&#xff1a;1&#xff09;、每个用户连续登录最大天数 2&#xff09;、连续登录大于三天的用户数 分析&#xff1a;本质都是计算用户连续登录天数 方案一&#xff1a;利用排序窗口 select a.user_id,a.date_rslt,count(1) as cnt from (select t.…

定个小目标之刷LeetCode热题(22)

这道题最容易想的就是排序后再遍历&#xff0c;但是时间复杂度就不是O(n)了&#xff0c;所以还是得用更优的解法&#xff0c;直接看题解&#xff0c;它是使用了HashSet&#xff0c;遍历数组&#xff0c;对于每一个数x&#xff0c;如果不存在x - 1则进入内循环&#xff0c;否则跳…

java智慧工地系统源码 智慧工地标准之一:环境监测 告别灰头土脸、智慧工地环境监测系统都包括哪些功能?

java智慧工地系统源码 智慧工地标准之一&#xff1a;环境监测 告别灰头土脸、智慧工地环境监测系统都包括哪些功能&#xff1f; 智慧工地环境监测系统是一套集成了物联网、大数据和云计算技术的系统&#xff0c;主要用于实时监测和管理建筑工地的环境状况。以下是该系统的一些核…

金融科技行业的融资趋势、投资者关注及未来预测

一、金融科技行业的融资趋势 金融科技行业的融资趋势近年来展现出强劲的增长势头&#xff0c;具体表现在以下几个方面&#xff1a; 融资规模持续扩大&#xff1a; 根据《全球金融科技投融资趋势报告(2023年上半年)》&#xff0c;2023年上半年全球金融科技行业投融资事件总次数…

语言大模型:开启自然语言处理的新篇章

随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域取得了显著的成果。其中&#xff0c;语言大模型&#xff08;Language Models&#xff09;作为近年来崛起的一种新型神经网络模型&#xff0c;已经在文本生成、机器翻译、情感分析等多个NLP任…

Vue02-第一个Vue程序

第一个Vue程序 1、什么是MVVM MVVM&#xff08;Model-View-ViewModel&#xff09;是一种软件设计模式&#xff0c;由微软WPF&#xff08;用于替代WinForm&#xff0c;以前就是用这个技术开发桌面应用程序的&#xff09;和Silverlight&#xff08;类似于Java Applet&#xff0…

基于Java的冬奥会科普平台

开头语&#xff1a;你好&#xff0c;我是计算机学姐码农小野。如果你对冬奥会科普平台感兴趣或有其他技术需求&#xff0c;欢迎随时私信我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java、B/S架构 工具&#xff1a;MyEclipse、MySQL 系统展示…

ANSYS导入图片建模教程

将一张PNG或JPG格式的图片导入到ANSYS内&#xff0c;根据图片内容生成几何模型可通过下面的思路来实现。 首先选取一张需要导入的图片文件。这里采用随机成长算法生成了一张多孔结构图片&#xff0c;图片样式及绘图参数如下。 利用CAD图像导入插件将图片处理成AutoCAD文件&a…

Zygote进程的理解

Zygote进程是安卓系统的一个重要进程&#xff0c;由init进程创建而来&#xff1b;另外系统里的重要进程&#xff08;system_server等&#xff09;都是由zygote进程fork的&#xff0c;所有的app进程也是由zygote进程fork的。 一、C 里的fork函数 fork是Linux里面创建子进程的函…

电脑怎么录音?分享2种音频录制方法

在日常生活和工作中&#xff0c;我们经常需要录制电脑上的音频&#xff0c;无论是为了记录会议内容、保存网络课程&#xff0c;还是为了制作自己的音频素材&#xff0c;录音功能都显得尤为重要。那么电脑怎么录音&#xff1f;本文将详细介绍2种方法教你如何在电脑上进行录音&am…

这个是 2024 Idea最新激活码

idea的激活与安装 操作如下&#xff1a; ① 打开网站&#xff1a;https://web.52shizhan.cn 切换到&#xff1a;正版激活码&#xff0c;点击获取 ② 获取后的激活码&#xff0c;到idea里打开help->register 打开弹窗&#xff0c;如图 切换的activate code 输入激活码&…

预埋螺栓抗滑移系数检测 内六角螺栓扭矩系数检测

螺栓检测范围&#xff1a;螺栓&#xff0c;高强螺栓&#xff0c;地脚螺栓&#xff0c;不锈钢螺栓&#xff0c;六角头螺栓&#xff0c;管片螺栓&#xff0c;膨胀螺栓&#xff0c;化学螺栓&#xff0c;镀锌螺栓&#xff0c;植筋螺栓&#xff0c;普通螺栓&#xff0c;钢结构螺栓&a…

Ubuntu乌班图安装VIM文本编辑器工具

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu-24.04-live-server-amd64启用ssh Ubuntu安装qemu-guest-agent 文章目录 系列文章目录前言一、安装VIM&#xff1f;二、VIM基本设置总结 前言 从centos转到Ubuntu发现默认安装没有vi 一、安装VIM&#xff1…

Springboot整合Kafka消息队列服务实例

一、Kafka相关概念 1、关于Kafka的描述 Kafka是由Apache开源&#xff0c;具有分布式、分区的、多副本的、多订阅者&#xff0c;基于Zookeeper协调的分布式处理平台&#xff0c;由Scala和Java语言编写。通常用来搜集用户在应用服务中产生的动作日志数据&#xff0c;并高速的处…

Erlang程序设计[Part1-Part2 chapter4]

前言&#xff1a; 环境安装 Erlang Shell&#xff0c;CSDN搜教程 Erlang Shell实操 启动 erl Erlang Shell以表达式为执行单位&#xff1f; 结束标志 .加上回车 Part1 为何用 Erlang chapter 1 什么是并发 并发vs并行 并发 单核cpu运行多个进程 一次运行一个 并行 多…

css-Echarts图表柱状图,X轴横坐标值显示不完全问题

1.问题 在Echarts图表中当横坐标数值过多&#xff0c;或者数值过长时会导致部分横坐标不显示。数据量少或简单会默认显示完全&#xff0c;当放大时会导致部分横坐标隐藏。 更改第一个Mon字段名 会发现偶数横坐标显示隐藏&#xff1b; 2.解决方法 2.1 在x横坐标中添加interval…

CPU占用100%的解决办法

上课&#xff0c;先看问题 这里看有个.logrotate的进程占用CPU最高&#xff0c;这里就需要把这个清理掉 执行 ps aux | grep logrotate然后将这个进程杀掉 kill -9 3194067然后再看CPU占有率就下来了 下课

2024北京智源大会开幕,智源推出大模型全家桶及全栈开源技术基座新版图,大模型先锋集结共探AGI之路

2024年6月14日&#xff0c;第六届“北京智源大会”在中关村展示中心开幕。 北京智源大会是智源研究院主办的“AI内行顶级盛会”&#xff0c;以“全球视野、思想碰撞、前沿引领”为特色&#xff0c;汇聚海内外研究者分享研究成果、探寻前沿知识、交流实践经验。2024北京智源大会…