【JavaEE进阶】Spring事务

目录

🍃前言

🌴事务简介

🚩 什么是事务?

🚩为什么需要事务?

🚩事务的操作

🍀Spring 中事务的实现

🚩Spring 编程式事务

🚩Spring声明式事务@Transactional

🚩@Transactional的作用


🍃前言

本篇文章主要内容为以下两个方面

  1. 对事务进行一个简单的介绍
  2. Spring中事务如何实现

🌴事务简介

事务的概念,我相信很多人在数据库的时候已经听过和了解了,所以这里只进行简单的介绍

🚩 什么是事务?

事务是⼀组操作的集合,是⼀个不可分割的操作。

事务会把所有的操作作为⼀个整体,⼀起向数据库提交或者是撤销操作请求。

所以这组操作要么同时成功,要么同时失败。

🚩为什么需要事务?

我们在进行程序开发时,也会有事务的需求.

举个例子吧

比如转账操作,A向B转账

  • 第⼀步:A账⼾-100元.
  • 第⼆步:B账⼾+100元.

如果没有事务,第⼀步执⾏成功了,第⼆步执⾏失败了,那么A账⼾的100元就平⽩⽆故消失了.

如果使⽤事务就可以解决这个问题,让这⼀组操作要么⼀起成功,要么⼀起失败.

🚩事务的操作

事务的操作主要有三步:

  1. 开启事start transaction/begin(⼀组操作前开启事务)
  2. 提交事务:commit(这组操作全部成功,提交事务)
  3. 回滚事务:rollback(这组操作中间任何⼀个操作出现异常,回滚事务)

🍀Spring 中事务的实现

前⾯课程我们讲了MySQL的事务操作,Spring对事务也进⾏了实现.

Spring 中的事务操作分为两类:

  1.  编程式事务(⼿动写代码操作事务).
  2. 声明式事务(利⽤注解⾃动开启和提交事务). 

在学习事务之前,我们先准备数据和数据的访问代码

需求: ⽤⼾注册,注册时在⽇志表中插⼊⼀条操作记录

数据准备:  

代码准备:

  • 1. 创建项⽬spring-trans,引⼊SpringWeb,Mybatis,mysql等依赖
  •  2. applicant.yml 文件配置:  
  • 3. model(实体类)  
  • 4. controller
  •   5. service  
  • 6. model  
  • 7. mapper  
  • 测试  

🚩Spring 编程式事务

Spring ⼿动操作事务和上⾯MySQL操作事务类似,有3个重要操作步骤:

  • 开启事务(获取事务)
  • 提交事务
  • 回滚事务

 SpringBoot 内置了两个对象: 

  1. DataSourceTransactionManager 事务管理器.用来获取事务(开启事务),提交或回滚事务的
  2. TransactionDefinition 是事务的属性,在获取事务的时候需要将TransactionDefinition 传递进去从而获得⼀个事务TransactionStatus

我们先来实现一个增加用户,提交事务的案例,操作代码如下:  

首先查看当前表中数据:    

通过Postman进行访问:  

再次查看表中数据:    

没有任何变化,成功进行了回滚操作。

我们再来查看事务的提交:

代码:  

  首先查看当前表中数据:   

通过Postman进行访问:  

再次查看表中数据:    

可以看到当前表中并没有id为4的字段,那么可以看出成功的进行了回滚

以上代码虽然可以实现事务,但操作也很繁琐,有没有更简单的实现⽅法呢?

是有的,接下来我们来看一下声命式事务

🚩Spring声明式事务@Transactional

声明式事务的实现很简单

两步操作:

1. 添加依赖 

​编辑 

2. 在需要事务的⽅法上添加 @Transactional 注解就可以实现了.⽆需⼿动开启事务和提交事 务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了没有处理的异常会⾃动 回滚事务.

代码:    

进行访问:  

 查看数据库,添加成功:   

使用此注解后,我们还可以从日志中观察到committing表示事务提交成功  

接下来我们修改代码,使该程序出现异常,然后再看看效果  

此时,我们再进行访问时,会出现异常  

数据库数据也没有进行添加  

观察日志,也没有出现committing,说明事务进行了回滚

 小结:若加了 @Transactional注解,出现异常会自动的把数据进行回滚;若没有加@Transactional注解,数据会执行成功,不会进行回滚(事务没有开启),在表中显示。 

🚩@Transactional的作用

@Transactional 可以用来修饰⽅法或类:

  • 修饰⽅法时:只有修饰public⽅法时才生效(修饰其他⽅法时不会报错,也不生效)[推荐]
  • 修饰类时:对 @Transactional 修饰的类中所有的public⽅法都⽣效 

方法/类被 @Transactional 注解修饰时,在目标方法执行开始之前,会自动开启事务,方法执行结束之后,自动提交事务.

  •  如果在方法执行过程中,出现异常,且异常未被捕获,就进行事务回滚操作.
  • 如果异常被程序捕获,⽅法就被认为是成功执行,依然会提交事务. 

比如我们对上述代码进行修改,对异常进行捕获  

发送请求后,再次访问查看数据库,发现数据添加成功  

观察日志:这些报红的信息是e.printStackTrace打印的

运⾏程序,发现虽然程序出错了,但是由于异常被捕获了,所以事务依然得到了提交.

如果想进行回滚,那么有两种方式可以实现

  • 1. 重新抛出异常
  • 2. 设置手动回滚

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

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

相关文章

MySQL索引特性——会涉及索引的底层B+树

1 没有索引,可能会有什么问题 索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index ,查询速度就可能提高成百上千倍。但是天下没有免…

给单片机生成字库的方案

Python 这段代码用来将txt文件中储存的字符串转变成二进制的像素数据 from PIL import Image, ImageFont, ImageDraw import osdef find_microsoft_yahei():"""Windows系统定位微软雅黑字体"""font_paths ["C:/Windows/Fonts/msyh.ttc&q…

01Spring Security框架

Spring Security是什么? Spring Security是⼀个提供身份验证、授权和针对常见攻击的保护的框架。 Spring Security做什么? 作为开发⼈员,在⽇常开发过程中需要⽤到Spring Security的场景⾮常多。事实上,对Web应⽤程序⽽⾔&#xf…

「BWAPP靶场通关记录(1)」A1注入漏洞

BWAPP通关秘籍(1):A1 injection 1.HTML Injection - Reflected (GET)1.1Low1.2Medium1.3High 2.HTML Injection - Reflected (POST)2.1Low2.2Medium2.3High 3.HTML Injection - Reflected (URL)3.1Low3.2/3.3Medium/HIgh 4.HTML Injection - …

机器学习算法实战——敏感词检测(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 引言 随着互联网的快速发展,信息传播的速度和范围达到了前所未有的高度。然而,网络空间中也充斥着大量的…

Ollama+DeepSeek+NatCross内网穿透本地部署外网访问教程

目录 一、Ollama 简介 二、下载Ollama 三、下载并运行 DeepSeek 模型 四、运行 DeepSeek 模型 五、NatCross免费内网穿透 六、配置 ChatBox 连接 Ollama 七、外网使用ChatBox体验 一、Ollama 简介 Ollama 是一个开源的本地大模型部署工具,旨在让用户能够在个…

联想台式电脑启动项没有U盘

开机按F12,进入启动设备菜单,发现这里没有识别到插在主机的U盘? 解决方法 1、选上图的Enter Setup或者开机按F2,进入BIOS设置 选择Startup -> Primary Boot Sequence 2、选中“Excludeed from boot order”中U盘所在的一行 …

开源链动 2+1 模式 AI 智能名片 S2B2C 商城小程序助力社群发展中榜样影响力的提升

摘要:本文深入剖析了社群发展进程中榜样所承载的关键影响力,并对开源链动 21 模式 AI 智能名片 S2B2C 商城小程序在增强这一影响力方面所具备的潜力进行了全面探讨。通过对不同类型社群,如罗辑思维社群和 007 不出局社群中灵魂人物或意见领袖…

《交互式线性代数》

《交互式线性代数》 *Interactive Linear Algebra*由Dan Margalit和Joseph Rabinoff编写,是一本聚焦线性代数的教材。本书旨在教授线性代数的核心概念、方法及其应用,通过代数与几何相结合的方式,帮助读者深入理解线性代数的本质&#xff0c…

CSS -属性值的计算过程

目录 一、抛出两个问题1.如果我们学过优先级关系,那么请思考如下样式为何会生效2.如果我们学习过继承,那么可以知道color是可以被子元素继承使用的,那么请思考下述情景为何不生效 二、属性值计算过程1.确定声明值2.层叠冲突3.使用继承4.使用默…

生活中的可靠性小案例11:窗户把手断裂

窗户把手又断了,之前也断过一次,使用次数并没有特别多。上方的图是正常的把手状态,断的形状如下方图所示。 这种悬臂梁结构,没有一个良好的圆角过渡,导致应力集中。窗户的开关,对应的是把手的推拉&#xff…

怎么解决在Mac上每次打开文件夹都会弹出一个新窗口的问题

在Mac上每次打开文件夹都会弹出一个新窗口的问题,可以通过以下方法解决‌ ‌调整Finder设置‌: 打开Finder,点击“Finder”菜单,选择“偏好设置”。在偏好设置中,选择“通用”标签。取消勾选“在标签页中打开文件夹”或…

HOT100——栈篇Leetcode739. 每日温度

文章目录 题目:Leetcode160. 相交链表原题链接思路代码 题目:Leetcode160. 相交链表 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温…

C++ 返回值优化(Return Value Optimization)

Intro 返回值优化(Return Value Optimization, RVO)是 C中的一种编译器优化技术, 它允许编译器在某些情况下省略临时对象的创建和复制/移动操作, 从而提高程序性能. RVO 主要应用于函数返回值的场景. 两种形式的 RVO 假定我们有这样一个类: class MyClass {std::string nam…

C++内存管理(复习)

1.动态申请多个某类型的空间并初始化 //动态申请10个int类型的空间并初始化为0到9int* p new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; delete[] p; //销毁 2.new/delete new:开空间构造函数 delete:析构函数释放空间 new和delete是用户进行动态内存申请和释放的操作符&#…

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分…

Java数据结构第二十三期:Map与Set的高效应用之道(二)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、哈希表 1.1. 概念 1.2. 冲突 1.3. 避免冲突 1.4. 解决冲突 1.5. 实现 二、OJ练习 2.1. 只出现一次的数字 2.2. 随机链表的复制 2.3. 宝石与石头 一、哈希表 1.1. 概念 顺序结构以及平衡树中…

OSPF | LSDB 链路状态数据库 / SPF 算法 / 实验

注:本文为 “OSPF | LSDB / SPF ” 相关文章合辑。 LSDB 和 SPF 算法 潇湘浪子的蹋马骨汤 发布 2019-02-15 23:58:46 1. 链路状态数据库 (LSDB) 链路状态协议除了执行洪泛扩散链路状态通告(LSA)以及发现邻居等任务外,其第三个任…

Android Framework 之了解系统启动流程二

Android Framework 源码阅读系列篇章有: 系统启动流程一之init进程和zygote进程启动分析系统启动流程二之SystemServer进程启动分析 1. SystemServer 进程启动分析 在 系统启动流程一之init进程和zygote进程启动分析 中分析 zygote 进程时,我们知道了…

阿里云企业邮箱出现故障怎么处理?

阿里云企业邮箱出现故障怎么处理? 以下是处理阿里云企业邮箱故障的详细分步指南,帮助您快速定位问题并恢复邮箱正常使用: 一、初步排查:确认故障范围与现象 确定影响范围 全体用户无法使用 → 可能为阿里云服务端故障或网络中断。…