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

Spring5系列学习文章分享---第五篇(事务概念+特性+案例+注解声明式事务管理+参数详解 )

目录

    • 事务
      • 事务概念
        • 什么是事务
        • 事务四个特性(ACID)
      • 搭建事务操作环境
      • Spring 事务管理介绍
      • 注解声明式事务管理
      • 声明式事务管理参数配置
      • XML 声明式事务管理
      • 事务操作(完全注解声明式事务管理)
      • 感谢阅读

开篇:
欢迎再次来到 Spring 5 学习系列!在这个博客中,我们将深入研究 Spring 框架的J事务概念+特性+案例+注解声明式事务管理+参数详解

事务

事务概念

什么是事务

(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操

作都失败

(2)典型场景:银行转账

* lucy 转账 100 元 给 mary

* lucy 少 100,mary 多 100

事务四个特性(ACID)

(1)原子性

(2)一致性

(3)隔离性

(4)持久性

搭建事务操作环境

在这里插入图片描述

  1. 创建数据库表,添加记录
idusernamemoney
1lucy1000
2mary1000
  1. 创建 service,搭建 dao,完成对象创建和注入关系
  • service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource
@Service
public class UserService {//注入 dao@Autowiredprivate UserDao userDao;
}
@Repository
public class UserDaoImpl implements UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;
}
  1. dao 创建两个方法:多钱和少钱的方法,在 service 创建方法(转账的方法)
@Repository
public class UserDaoImpl implements UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;//lucy 转账 100 给 mary//少钱@Overridepublic void reduceMoney() {String sql = "update t_account set money=money-? where username=?";jdbcTemplate.update(sql,100,"lucy");}//多钱@Overridepublic void addMoney() {String sql = "update t_account set money=money+? where username=?";jdbcTemplate.update(sql,100,"mary");}
}
@Service
public class UserService {//注入 dao@Autowiredprivate UserDao userDao;//转账的方法public void accountMoney() {//lucy 少 100userDao.reduceMoney();//mary 多 100userDao.addMoney();}
}
  1. 上面代码,如果正常执行没有问题的,但是如果代码执行过程中出现异常,就会有问题
@Service
public class UserService {//注入 dao@Autowiredprivate UserDao userDao;//转账的方法public void accountMoney() {//lucy 少 100userDao.reduceMoney();// 模拟by zero异常int i = 1/0;//mary 多 100userDao.addMoney();}
}
  • 上面问题如何解决呢?

    • 使用事务来解决
  • 事务操作过程

//转账的方法public void accountMoney() {try{// **第一步** 开启事务// **第二步** 进行事务操作//lucy 少 100userDao.reduceMoney();// 模拟by zero异常int i = 1/0;//mary 多 100userDao.addMoney();// **第三步** 没有发生异常,提交事务}catch(Exception e){// **第四步** 出现异常,事务回滚}}

Spring 事务管理介绍

  1. 事务添加到 JavaEE 三层结构里面 Service 层(业务逻辑层)

  2. 在 Spring进行事务管理操作

  • 有两种方式:编程式事务管理声明式事务管理(使用)
  1. 声明式事务管理
  • 基于注解方式(使用)

  • 基于 xml 配置文件方式

  1. 在Spring 进行声明式事务管理,底层使用 AOP 原理

  2. Spring 事务管理 API

  • 提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
    在这里插入图片描述

注解声明式事务管理

  1. spring 配置文件配置事务管理器
<!--创建事务管理器-->
<bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--注入数据源--><property name="dataSource" ref="dataSource"></property>
</bean>
  1. spring 配置文件,开启事务注解
  • 在 spring 配置文件引入名称空间 tx
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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/context 
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx.xsd">
  • 开启事务注解
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
  1. service 类上面(或者 service 类里面方法上面)添加事务注解

(1)@Transactional,这个注解添加到类上面,也可以添加方法上面

(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务

(3)如果把这个注解添加方法上面,为这个方法添加事务

@Service
@Transactional
public class UserService {}

声明式事务管理参数配置

  1. service 类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数

在这里插入图片描述

  1. propagation**:事务传播行为**
  • 当一个事务方法被另外一个事务方法调用时候,这个事务方法如何进行
    在这里插入图片描述

  • 事务的传播行为可以有传遍属性指定。Spring定义了7种类传播行为
    在这里插入图片描述

  1. ioslation:事务隔离级别

(1)事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题

(2)有三个读问题:脏读、不可重复读、虚(幻)读

(3)脏读:一个未提交事务读取到另一个未提交事务的数据
在这里插入图片描述

(4)不可重复读:一个未提交事务读取到另一提交事务修改数据
在这里插入图片描述

(5)虚读:一个未提交事务读取到另一提交事务添加数据

(6)解决:通过设置事务隔离级别,解决读问题

在这里插入图片描述

  1. timeout:超时时间

(1)事务需要在一定时间内进行提交,如果不提交进行回滚

(2)默认值是 -1 ,设置时间以秒单位进行计算

  1. readOnly:是否只读

(1)读:查询操作,写:添加修改删除操作

(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作

(3)设置 readOnly 值是 true,设置成 true 之后,只能查询

  1. rollbackFor:回滚

  2. noRollbackFor:不回滚

  • 设置出现哪些异常不进行事务回滚

XML 声明式事务管理

  1. spring 配置文件中进行配置

第一步 配置事务管理器

第二步 配置通知

第三步 配置切入点和切面

<!--1 创建事务管理器-->
<bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--注入数据源--><property name="dataSource" ref="dataSource"></property>
</bean>
<!--2 配置通知-->
<tx:advice id="txadvice"><!--配置事务参数--><tx:attributes><!--指定哪种规则的方法上面添加事务--><tx:method name="accountMoney" propagation="REQUIRED"/><!--<tx:method name="account*"/>--></tx:attributes>
</tx:advice>
<!--3 配置切入点和切面-->
<aop:config><!--配置切入点--><aop:pointcut id="pt" expression="execution(* 
com.atguigu.spring5.service.UserService.*(..))"/><!--配置切面--><aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>

事务操作(完全注解声明式事务管理)

1、创建配置类,使用配置类替代 xml 配置文件
@Configuration //配置类
@ComponentScan(basePackages = "com.atguigu") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {//创建数据库连接池@Beanpublic DruidDataSource getDruidDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///user_db");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}//创建 JdbcTemplate 对象@Beanpublic JdbcTemplate getJdbcTemplate(DataSource dataSource) {//到 ioc 容器中根据类型找到 dataSourceJdbcTemplate jdbcTemplate = new JdbcTemplate();//注入 dataSourcejdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}//创建事务管理器@Beanpublic DataSourceTransactionManager 
getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager transactionManager = new 
DataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;}
}

感谢阅读

感谢您阅读 Spring 5 学习系列的第五篇!在这篇文章中,我们探索了Spring5的(事务概念+特性+案例+注解声明式事务管理+参数详解 )

下一篇文章即将发布! 在第六篇中,我们将深入研究Spring 5的新特性,为您分享我学习的Spring5的收获,请继续关注我的系列。

谢谢您的陪伴! 如果您有任何问题、建议或想要了解的特定主题,请随时在评论中告诉我们。我们期待与您共同探索Spring 5,共同提升我们的Java开发技能!

敬请期待第六篇的发布,我们将很快与您再次见面!

学习视频来源尚硅谷Spring5

相关文章:

  • 缓存技术—redis
  • 网络安全03---Nginx 解析漏洞复现
  • LightDB 24.1 UNION支持null类型匹配
  • 光明之盒:揭开可解释性人工智能的神秘面纱
  • 一种解决常用存储设备无法被电脑识别的方法
  • 【开源】基于JAVA语言的二手车交易系统
  • js中的内置对象、数学对象、日期对象、数组对象、字符串对象
  • spark-flink设计思想之吸星大法-1
  • jQuery HTML - 设置 —— W3school 详解 简单易懂(十二)
  • 【go】Ubuntu 22.04 LTS golang go-ethereum编译安装
  • C#使用TimeSpan对象获取时间间隔
  • SpringBoot3集成Zookeeper
  • 单片机学习笔记---独立按键控制LED显示二进制
  • 大数据期望最大化(EM)算法:从理论到实战全解析
  • 53-JS之BOM,打开,关闭窗口,screen对象,history对象,location对象,工作区尺寸,滚动距离
  • CSS魔法堂:Absolute Positioning就这个样
  • css系列之关于字体的事
  • echarts花样作死的坑
  • eclipse的离线汉化
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Flex布局到底解决了什么问题
  • Invalidate和postInvalidate的区别
  • JDK 6和JDK 7中的substring()方法
  • Python3爬取英雄联盟英雄皮肤大图
  • SAP云平台里Global Account和Sub Account的关系
  • vuex 学习笔记 01
  • web标准化(下)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 服务器之间,相同帐号,实现免密钥登录
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 数据仓库的几种建模方法
  • 通过git安装npm私有模块
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 异常机制详解
  • 容器镜像
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)80c52学习之旅-起始篇
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)kafka实战——kafka源码编译启动
  • (转)详解PHP处理密码的几种方式
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .gitattributes 文件
  • .java 9 找不到符号_java找不到符号
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net中生成excel后调整宽度
  • /etc/motd and /etc/issue
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [20181219]script使用小技巧.txt
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [Docker]五.Docker中Dockerfile详解
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [English]英语积累本