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.mzph.cn/news/649498.shtml

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

相关文章

Lowest Common Ancestor

模板 1. Tarjan 一个讲的很好的视频&#xff1a;D10 Tarjan算法 P3379【模板】最近公共祖先&#xff08;LCA&#xff09;_哔哩哔哩_bilibili&#xff0c;董晓算法出品。 Tarjan总体来说可以概括为&#xff1a; 记录访达&#xff1a;记录某个节点是否已经访问过&#xff0c;防…

3. MATLAB中Plot绘制放大特定的区域

在MATLAB中&#xff0c;我们经常需要绘制图形并进行一些自定义的操作。在本示例中&#xff0c;我们将演示如何在MATLAB中绘制一个图形&#xff0c;并通过放大某个特定的区域来突出显示。 ## 原始图形 首先&#xff0c;我们绘制了一个包含正弦和余弦函数的图形。 % MATLAB 代…

RabbitMQ 笔记二

1.Spring 整合RabbitMQ 生产者消费者 创建生产者工程添加依赖配置整合编写代码发送消息 创建消费者工程添加依赖配置整合编写消息监听器 2.创建工程RabbitMQ Producers spring-rabbitmq-producers <?xml version"1.0" encoding"UTF-8"?> <pr…

【计算机图形学】实验五 一个简单的交互式绘图系统(实验报告分析+截图+源码)

可以先看一看这篇呀~【计算机图形学】专栏前言-CSDN博客https://blog.csdn.net/m0_55931547/article/details/135863062 目录 一、实验目的 二、实验内容

77 C++对象模型探索。虚函数- 从静态联编,动态联编出发,分析 虚函数调用问题探究

什么叫做单纯的类&#xff1a; 比较简单的类&#xff0c;尤其不包括 虚函数 和虚基类。 什么叫不单纯的类&#xff1a; 从上一章的学习我们知道&#xff0c;在某些情况下&#xff0c;编译器会往类内部增加一些我们看不见但是真实存在的成员变量&#xff0c;例如vptr&#xff…

unitary MUSIC 算法

unitary MUSIC 算法 论文 A Unitary Transformation Method for Angle-of-Arrival Estimation 中提出了 unitary MUSIC 的算法&#xff0c;直译就是酉 MUSIC 算法&#xff0c;即酉变换 MUSIC 算法。该算法的目的是简化计算复杂度&#xff0c;将传统 MUSIC 算法中的复数 SVD 和复…

【shell-10】shell实现的各种kafka脚本

kafka-shell工具 背景日志 log一.启动kafka->(start-kafka)二.停止kafka->(stop-kafka)三.创建topic->(create-topic)四.删除topic->(delete-topic)五.获取topic列表->(list-topic)六. 将文件数据 录入到kafka->(file-to-kafka)七.将kafka数据 下载到文件-&g…

Linux内核中USB设备驱动实现

USB 设备驱动&#xff1a; 一、USB 描述符&#xff1a;&#xff08;存在于USB 的E2PROM里面&#xff09; 1、 设备描述符&#xff1a;struct usb_device_descriptor 2、 配置描述符&#xff1a;struct usb_config_descriptor 3、 接口描述符&#xff1a;struct usb_interfa…

linux深度学习开发基础命令——极简版

linux深度学习开发基础命令——极简版 本博客只是阐述常用的部分shell命令&#xff0c;更为全面的内容请参考其他博客 1. 创建python虚拟环境 默认使用conda创建 conda create -yourenv_name pyhton3.x 查看全部虚拟环境 conda env list 激活虚拟环境 conda activate env_name …

GO——GPM

参考&#xff1a;https://juejin.cn/post/6844904130398404616 并发模型 参考&#xff1a;https://zhuanlan.zhihu.com/p/137339439 多进程 要点 主进程监听每进来一个请求&#xff0c;fork子进程处理 缺点 进程占用高&#xff0c;服务器负载高进程间通信困难 参考&#xff…

2024 CKA 题库 | 15、备份还原 etcd

不等更新题库 文章目录 15、备份还原 etcd题目:考点&#xff1a;参考链接:解答:备份快照恢复快照 检查 15、备份还原 etcd 题目: 设置配置环境 此项目无需更改配置环境。但是&#xff0c;在执行此项目之前&#xff0c;请确保您已返回初始节点。 [candidatemaster01] $ exit #…

【Deeplabv3+】Ubutu18.04中使用pytorch复现Deeplabv3+第三步)-----CityscapesScripts生成自己的标签

本文是在前面两篇文章的基础上&#xff0c;讲解如何更改训练数据集颜色&#xff0c;需要与前面两篇文章连起来看。 本文用于修改cityscapes数据集的标签颜色与Semankitti数据集的标签一致&#xff0c;对修改后的数据集进行训练。需要下载两个开发工具包和一个数据集&#xff0…

Git标签推送

标签默认属于本地分支&#xff0c;推送分支的时候并不会上传。需要自己手动推送 通过命令 git push origin <tagname>推送指定的标签 通过命令git push origin --tags批量推送所有的标签 在VS里打开git命令行窗口的方法&#xff1a;Git更改-操作-打开命令行提示符 对于…

1.19信息学,信息熵(wordle)

所谓均方误差实际上就是方差 分析&#xff1a;对单词进行编码后&#xff0c;采用聚类方法&#xff0c;可以将单词难度分为三类或者更多&#xff0c;如困难、一般、简单。然后对每一类的单词可视化分析&#xff0c;并描述数据得出结论。 聚类算法较多&#xff0c;在论文中可以…

Docker镜像

创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 基于现有镜像创建 首先启动一个镜像&#xff0c;在容器里做修改 然后将修改后的容器提交为新的镜像&#xff0c;需要使用该容器的 ID 号创建新镜像 常用选项&#xff1a; -…

【Unity】【游戏开发】Pico打包后项目出现运行时错误如何Debug

【背景】 开发过程中的报错可以通过控制台查看&#xff0c;但是PICO项目这类依赖特定设备环境的应用往往存在打包后在设备端发生运行时错误。这时如何能查看到Debug信息呢&#xff1f; 【分析】 Pico也是安卓系统&#xff0c;所以这个问题就可以泛化为Unity有哪些在安卓端运…

Linux系统中编写bash脚本进行mysql的数据同步

一、为何要用脚本做数据同步 &#xff08;一&#xff09;、问题 我们的视频监控平台云服务器&#xff0c;需要向上级的服务器定期同步一些数据表的数据&#xff0c;前期做了个程序&#xff0c;可以实现同步。但是&#xff0c;现在数据库的结构改了&#xff0c;结果又需要该程序…

C++实现推箱子游戏

推箱子游戏 运行之后的效果如视频所示&#xff0c;在完成游戏后播放音乐 准备工作&#xff1a;建立一个新的文件夹&#xff0c;并在文件夹中任意增加一张背景图片&#xff0c;以及各个部件的照片文件 因为这里用到了贴图技术&#xff0c;要使用graphic.h这个函数&#xff0c…

用于 C/C++ Debug 的宏函数

Debug.h 用于打印 Debug 信息的小工具&#xff1a; #pragma once#include <stdio.h>#define DEBUG 1#define pn puts("") #define where printf("%s(%d)-<%s>.\n\n", __FILE__, __LINE__, __FUNCTION__)#if (DEBUG 1) #define print_error(…

海外云手机三大优势

在全球化潮流下&#xff0c;企业因业务需求对海外手机卡等设备的需求不断攀升&#xff0c;推动了海外云手机业务的蓬勃发展。相较于自行置备手机设备&#xff0c;海外云手机不仅能够降低成本&#xff0c;还具备诸多优势&#xff0c;让我们深入探讨其中的三大黄金优势。 经济实惠…