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 {@Autowiredprivate AccountService service;@Testpublic 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.mzph.cn/bicheng/29776.shtml

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

相关文章

不重新安装Anaconda找回不见的Anaconda Prompt

找回Anaconda Prompt只需三步 系统&#xff1a;win11 x641.cd Anaconda的安装目录2. Anaconda Prompt又回来了 系统&#xff1a;win11 x64 1.cd Anaconda的安装目录 winR 输入cmd 进入命令行&#xff0c;进入到Anaconda的安装目录 eg&#xff1a;我的Anaconda安装在&#xff…

一个简单的信号发射电路的构建

在基本的信号发射电路中&#xff0c;线圈&#xff08;电感器&#xff09;和电阻的组合可以产生振荡信号&#xff0c;而天线&#xff08;通常通过线圈&#xff09;用于发射信号。 LC振荡电路&#xff1a; **线圈&#xff08;L1&#xff09;和电容器&#xff08;C&#xff09;**串…

Ubuntu24多版本python解释器使用

1.前言 已给树莓派5安装了Ubuntu24.04&#xff0c;带有python3.12.3&#xff0c;现在用视觉需要用到3.11版本的python解释器 2.实操过程 主要是对用到的命令进行备份&#xff0c;方便后面查询 2.1 安装python3.11 sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-ge…

底价竞拍成功,兴业法拍网何淑帅助高先生圆梦三居~

今日我们荣幸地向大家宣告一条喜讯。三部法拍经理何淑帅以其卓越的能力与竭诚的服务态度&#xff0c;成功助力高先生起拍价成交顺义裕龙六区的一套三居室。 高先生经朋友介绍与三部经理何淑帅结缘&#xff0c;他本身对该小区有所知晓&#xff0c;且正好在周边工作&#xff0c;何…

2.什么是计算机程序

什么是计算机程序? 计算机程序是为了告诉计算机"做某件事或解决某个问题"而用"计算机语言编写的命令集合(语句) 只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作,计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成 现实生活中你如…

JVM 基本组成

一、为什么要学习 JVM &#xff1f; 1. “ ⾯试造⽕箭&#xff0c;⼯作拧螺丝” &#xff0c; JVM 属于⾯试官特别喜欢提问的知识点&#xff1b; 2. 未来在⼯作场景中&#xff0c;也许你会遇到以下场景&#xff1a; 线上系统突然宕机&#xff0c;系统⽆法访问&#xff0c;甚⾄直…

在向量数据库中存储多模态数据,通过文字搜索图片

在向量数据中存储多模态数据&#xff0c;通过文字搜索图片&#xff0c;Chroma 支持文字和图片&#xff0c;通过 OpenClip 模型对文字以及图片做 Embedding。本文通过 Chroma 实现一个文字搜索图片的功能。 OpenClip CLIP&#xff08;Contrastive Language-Image Pretraining&…

Ps:脚本与动作

有三种脚本语言可用于编写 Photoshop 脚本&#xff1a;AppleScript&#xff08;macOS&#xff09;、JavaScript 和 VBScript&#xff08;Windows&#xff09;。 Photoshop 脚本文件默认文件夹 Win&#xff1a;C:\Program Files\Adobe\Adobe Photoshop 2024\Presets\Scripts Mac…

代码随想录-Day35

134. 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 …

Java阻塞队列:DelayQueue

Java阻塞队列&#xff1a;DelayQueue 在Java的并发编程中&#xff0c;阻塞队列是一种非常有用的数据结构&#xff0c;它不仅提供了线程安全的队列操作&#xff0c;还在必要时会自动阻塞获取操作&#xff0c;直到队列变得不为空。本文将重点介绍一种特殊的阻塞队列——DelayQue…

递归与回溯 || 排列问题

目录 前言&#xff1a; 全排列 题解&#xff1a; 全排列 II 题解&#xff1a; 子集 题解&#xff1a; 组合 题解&#xff1a; 组合总和 题解&#xff1a; 电话号码的字母组合 题解&#xff1a; 字母大小写全排列 题解&#xff1a; 优美的排列 题解&#xff1a;…

AI虚拟数字人上线需要办理哪些资质?

近年来&#xff0c;随着AI 技术快速发展&#xff0c;虚拟数字人行业也进入了新的发展阶段。AI 技术可覆盖虚拟数字人的建模、视频生成、驱动等全流程&#xff0c;一方面使虚拟数字人的制作成本降低、制作周期缩短&#xff0c;另一方面&#xff0c;多模态 AI 技术使得虚拟数字人…

[面试题]缓存

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis 什么是缓存&#xff1f;…

KVM虚拟化基础

虚拟化基础与分类 x86 CPU特权级别设为四个Ring&#xff1a;Kernel Mode运行在Ring 0、User Mode运行在Ring 3&#xff1b; 非硬件辅助虚拟化&#xff08;一型&#xff09; Hypervisor运行在Ring 0&#xff1b; Guest OS不做修改&#xff0c;以为自己运行在Ring 0上&#xff0…

OpenAPI Typescript Codegen 的基本使用

下载 axios npm install axios OpenAPI Typescript Codegen 官网&#xff1a;https://github.com/ferdikoomen/openapi-typescript-codegen 安装 OpenAPI Typescript Codegen npm install openapi-typescript-codegen --save-dev–input&#xff1a;指定接口文档的路径、url …

小程序餐饮点餐系统,扫码下单点菜,消费端+配送端+收银端+理端

目录 前言&#xff1a; 一、小程序功能有哪些 前端&#xff1a; 管理端&#xff1a; 二、实体店做小程序的好处 方便快捷的点餐和支付体验&#xff1a; 扩大店铺的曝光度和影响力&#xff1a; 优化顾客体验和服务质量&#xff1a; 降低成本和提高效率&#xff1a; 数据…

【学习】程序员资源网址

1 书栈网 简介&#xff1a;书栈网是程序员互联网IT开源编程书籍、资源免费阅读的网站&#xff0c;在书栈网你可以找到很多书籍、笔记资源。在这里&#xff0c;你可以根据热门收藏和阅读查看大家都在看什么&#xff0c;也可以根据技术栈分类找到对应模块的编程资源&#xff0c;…

Microsoft Visual C++ Redistributable 【安装包】【高速下载】

方法1、可以从官方下载&#xff0c;如下图 Visual C Redistributable for Visual Studio 2015 但是此链接只有一个版本 方法2 已经下载好并且已经整理好了2008--2022的所有版本点击下方链接即可高速下载 如果是win7-win8-win10-win11直接可以下载2015--2022版本&#xff0c…

大模型基础知识:探索人工智能的巨轮

人工智能大模型&#xff0c;这个在近年来频繁出现在科技新闻和学术论坛的热门词汇&#xff0c;已经成为了推动人工智能技术发展的关键力量。这些大模型&#xff0c;如OpenAI的GPT-3、谷歌的BERT、百度的ERNIE等&#xff0c;以其强大的性能和广泛的应用范围&#xff0c;引起了广…

【AI大模型】在健康睡眠监测中的深度融合与实践案例

文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例&#xff1a;多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…