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

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

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

相关文章

记一个信息泄露到RCE

打点 开局一个登录框 信息收集 发现了一处接口泄露了部分信息 不过只有支付宝密钥的信息无法扩大危害&#xff0c;此时尝试寻找了一下其他同类型系统同样的接口&#xff0c;查看一下是否泄露的信息相同 因为如果相同就说明是静态的&#xff0c;没有价值横向收集 此时访问其他…

关于我写过那些MySQL专栏

写在文章开头 这是截至今日写过的文章汇总&#xff0c;对于关注笔者公众号有一段时间的读者都知道&#xff0c;笔者会每周对自己写过的文章整理至相关专栏&#xff0c;以便读者可以按需进行检索阅读。 你好&#xff0c;我叫sharkchili&#xff0c;目前还是在一线奋斗的Java开…

无需手动部署3分钟自动化搞定幻兽帕鲁游戏联机服务器搭建与好友一起玩

生存类游戏《幻兽帕鲁》异常火爆&#xff0c;大量玩家遭遇了卡顿、闪退、延迟高的糟糕体验&#xff0c;其实我们玩家也可以选择《幻兽帕鲁》的专用服务器模式&#xff0c;自行搭建服务器和好友畅玩&#xff0c;无需手动部署&#xff0c;3分钟自动化搞定游戏联机服务器搭建。 1…

代码随想录算法训练营第32天(贪心算法02● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

贪心算法 part02 122.买卖股票的最佳时机II解题思路 55. 跳跃游戏解题思路 45.跳跃游戏II &#xff08;来不及了 明天刷解题思路 122.买卖股票的最佳时机II 动态规划章节会重点讲买卖股票问题 本题解法很巧妙&#xff0c;大家可以看题思考一下&#xff0c;在看题解。 题目链接&…

Cybellum—信息安全测试工具

产品概述 由于软件和数据在汽车上的使用越来越多&#xff0c;汽车越来越“智能化”&#xff0c;汽车行业面临着重大的信息安全挑战。2021年8月&#xff0c;ISO/SAE 21434正式发布&#xff0c;标准中对汽车的信息安全提出了规范化的要求&#xff0c;汽车信息安全不容忽视。 Cyb…

HTML 曲线图表特效

下面是代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>基于 ApexCharts 的 HTML5 曲线图表DEMO演示</title><style> body {background: #000524; }#wrapper {padding-top: 20px;background: #000524;b…

Huggingface上传自己的模型

5.8更新几个比较坑的点 首先如果你的模型太大&#xff08;>5GB&#xff09;&#xff0c;那么需要使用下面的命令声明一下&#xff0c;否则无法push $ huggingface-cli lfs-enable-largefiles ./path/to/your/repo假如使用VScode提交&#xff0c;那么需要注意&#xff0c;在…

博弈论(牛客练习赛)

思路&#xff1a;我们考虑小念赢 1、如果n>1并且p0&#xff0c;小念可以连续取两次&#xff0c;相当于小念有挂&#xff0c;可以从必败态转为必胜态&#xff0c;必赢。 2、如果n>1并且m>n-1&#xff0c;小念第一次取n-1个&#xff0c;小念必赢。 代码&#xff1a; …

OJ_叠框问题

问题描述 c语言实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> using namespace std;int main() {int n; //存放外框尺寸int a,b; //存放两个字符char matrix[100][100] { 0 };//全部初始化为休止符/0while (scanf("%d %c %c&…

Hive实战 —— 电商数据分析(全流程详解 真实数据)

目录 前言需求概述数据清洗数据分析一、前期准备二、项目1. 数据准备和了解2.确定数据粒度和有效列3.HDFS创建用于上传数据的目录4.建库数仓分层 5.建表5.1近源层建表5.2. 明细层建表为什么要构建时间维度表&#xff1f;如何构建时间维度表&#xff1f; 5.3 轻聚层建表6. 指标数…

2024亚马逊开店教程:开店准备与注册流程指南

随着新一年的到来&#xff0c;亚马逊开启了新一轮的卖家入驻&#xff0c;并且针对新卖家优化了入驻流程&#xff0c;下面为大家简单整理一下最新亚马逊入驻教程&#xff0c;有想要入驻开店的小伙伴速速看过来&#xff01; 一、开店前准备 1、账号环境准备 为了防止账号由于网…

HttpHeaders 源码中headers成员变量为什么声明为final

源码如下 public class HttpHeaders implements MultiValueMap<String, String>, Serializable {private final Map<String, List<String>> headers;public String getFirst(String headerName) {List<String> headerValues (List)this.headers.get(…