MySQL:事务+@Transactional注解
事务
本章从了解为什么需要事务到讲述事务的四大特性和概念,最后讲述MySQL中的事务使用语法以及一些需要注意的性质。
再额外讲述一点Springboot中@Transactional注解的使用。
1.为什么需要事务?
我们以用户转账为例,假设用户A和用户B的银行账户中都有余额500元,用户A向用户B转账200元,在数据库中可以分解为如下操作:
| 序号 | 操作 |
|---|---|
| 1 | 用户A的余额-200 |
| 2 | 用户B的余额+200 |
如果服务器在执行完第一条操作后,服务器断电了,那么用户A的余额就是300,用户B的余额还是500,为了不出现这种情况,我们就需要用到事务来解决。
2.事务的四大特性(ACID)
事务四大特性的英文开头分别为AICD,为了方便记忆,调整顺序后为ACID(酸的意思)。
2.1 原子性(Atomicity)
顾名思义,原子在某种意义上意味着不可分割,事务的原子性将一个事务看作一个原子,中间不能被分割。
以用户A向用户B的转账为例,用户A余额-200,用户B的余额+200这个过程被看作一个事务,要么这两个操作全都执行成功,要么这两个操作全部执行失败,不能出现其中一个执行成功,另一个没有被执行的情况。
2.2 隔离性(Isolation)
隔离性指的是多个事务之间的隔离性,事务之间不能相互干扰,一个事务的运行不影响另一个事务的运行。
这里可能会有疑问,什么情况下事务之间会相互影响,我们同样以转账为例,举例一种破坏隔离性的情况:用户A、用户B和用户C都拥有500元的余额,用户A向用户B转账200元的同时,用户C向用户B转账200元。这里我们令事务T1=用户A向用户B转账200元,T2=用户C向用户B转账200元。如果让A转账完再让C去转账这样不会出现问题,但是如果A和C的转账过程是同时的可能就会出现问题,下面以表格来说明:从上到下为时间线,同一行表示在同一个时间点执行的语句。
| T1 | 说明 | T2 | 说明 |
|---|---|---|---|
| A=read(A) | 读取用户A的余额,当前A余额为500 | C=read© | 读取用户C的余额,当前C的余额为500 |
| A=A-200 | A的余额减少200,当前A的余额为300 | ||
| C=C-200 | C的余额减少200,当前C的余额为300 | ||
| Write(A) | 将A的变化写回数据库 | Write© | 将C的变化写回数据库 |
| B=Read(B) | 读取用户B的余额,当前B余额为500 | ||
| B=Read(B) | 读取用户B的余额,当前B余额为500 | ||
| B=B+200 | B的余额增加200,当前B的余额为700 | B=B+200 | B的余额增加200,当前B的余额为700 |
| Write(B) | 将B的变化写回数据库 | Write(B) | 将A的变化写回数据库 |
这里我们会发现,最终B的余额为700,正确的应该为900才对,这种就是两个事务之间相互影响了。
2.3 一致性(Consistency)
一致性表示数据库处理前后结果应与其所表示的客观世界中真实状况保持一致。
这怎么理解呢,我们以隔离性中的例子来举例,用户A和用户C同时向用户B转账,隔离性出错后数据库中错误的状态下用户A的余额为300,用户C的余额为300,用户B的余额为700,客观世界真实状态下应表示为用户A的余额为300,用户C的余额为300,用户B的余额为900,这种状况下就出现了数据库前后处理结果与其所表示的客观世界的真实状况不一致。一致性就是要保证数据库中的结果和客观世界中的情况保持一致。
2.4 持久性(Durability)
持久化这个词可能都有听过,就是让数据能够永久保存下来,事务的持久性表示事务提交之后,必须对数据库进行修改,并且这个结果是永久保存的,除非后来经过了更改。
3.事务的概念
把需要保证事务四大特性的一个或多个数据库操作称为事务。一个事务可能会经理的状态如下:
- 活动的:事务对应的数据库操作正在执行中。
- 部分提交的:事务对应的最后一个数据库操作执行完成后,当前数据都还在内存中,还没有刷盘,这个状态下叫部分提交的。
- 失败的:由于停电、服务器死机或手动停止事务导致事务对应的数据库操作执行到一半就没办法继续执行了,这种状态下成为失败的状态。
- 中止的:失败的状态下将已经执行过的数据库操作回滚后完成后,也就是恢复到当前事务处理之前的状态后,称为中止状态。
- 提交的:事务执行成功,并且数据都刷盘成功。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7KWrZq2I-1677825883583)(D:\desktop\work\笔记\笔记图片素材\image-20230303124357290.png)]
只有当事务的状态处于中止的或者提交的时,事务的生命周期才结束。
4.MySQL中事务的语法
4.1 开启事务
-
BEGIN [WORK]开启一个事务,WORK可有可无。
-
START TRANSACTION开启一个事务,后面可以跟几个修饰符:
#修饰符 # READ ONLY表示只读,READ WRITE可读写,WITH CONSISTENT SNAPSHOT一致性读,修饰符直接加在START TRANSACTION后面,多个修饰符用逗号分隔,READ ONLY和READ WRITE不能同时使用#只读 START TRANSACTION READ ONLY; #可读写 START TRANSACTION READ WRITE; #一致性读 START TRANSACTION WITH CONSISTENT SNAPSHOT; #多个修饰符 START TRANSACTION READ ONLY,WITH CONSISTENT SNAPSHOT;
4.2 提交事务
-
COMMIT [WORK]提交事务,
WORK可有可无。BEGIN;#一系列数据库操作#提交事务 COMMIT;
4.3 手动中止事务
-
ROLLBACK [WORK]回滚一个事务,
WORK可有可无。BEGIN;#一系列数据库操作#回滚 ROLLBACK;
4.4 支持事务的存储引擎
目前只有InnoDB和NDB支持事务。
4.5 自动提交
MySQL中的一个系统变量autocommit,用来自动提交事务。
SHOW VARIABLES LIKE 'autocommit';+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
可以看到autocommit默认为ON开启状态,如果不显示的使用BEGIN或START TRANSACTION开启事务,那么每一条语句都会算作一个单独的事务进行提交。
如果设置autocommit为off,那么运行的所有语句必须COMMIT后才能成功更新数据库。
4.6 隐式提交
当使用START TRANSACTION或BEGIN开启事务后,在COMMIT之前使用某些语句可能会导致事务偷偷被提交了,这就叫隐式提交。会导致事务隐式提交的语句有如下:
-
DDL语句:
CREATE、ALTER、DROP等语句修改数据库对象时,就会隐式提交前面语句所属的事务。 -
隐式的使用或修改了mysql数据表。
比如:
ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD等。 -
事务控制或关于锁定的语句:
- 在事务
COMMIT之前又使用了一次START TRANSACTION或BEGIN会隐式提交。 - 使用
LOCK TABLES、UNLOCK TABLES也会隐式提交。
- 在事务
-
关于MySQL复制的一些语句:
SRART SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO等语句也会隐式提交前面语句所属的事务。 -
其他语句:
ALALYZY TABLE、CHANGE INDEX、CHECK TABLE、FLUSH、LOAD INDEX INTO CHANGE、OPTIMIZE TABLE、REPAIR TABLE、RESET等语句。
4.7 保存点
MySQL事务支持在事务的执行过程中设置保存点,可以使用ROLLBACK语句回滚到事务的某个特定保存点的状态。
-
SAVEPOINT 保存点名称;设置保存点。
-
ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称;回滚到对应的保存点的状态。
-
RELEASE SAVEPOINT 保存点名称;释放对应的保存点。
示例:
#开启事务
BEGIN;#更新日志表里的所有用户名为123
UPDATE log_tbl SET user_name = '123';#设置保存点
SAVEPOINT s1;#更新日志表里的所有用户名为124
UPDATE log_tbl SET user_name = '1234';#回滚到保存点s1时的状态
ROLLBACK TO s1;#释放保存点
RELEASE SAVEPOINT s1;#回滚整个事务
ROLLBACK;
5.@Transactional
再Springboot+MyBatis中使用事务非常简单,只需要再需要以事务方式运行的函数上加@Transactional注解即可,下面以一个Controller接口为例:
@RequestMapping("/getToken")
@ResponseBody
@Transactional
public String reloadTokenByAppIdAndAppSecret(AccessApiConfirm data){return apiAccessConfirmService.reloadTokenByAppIdAndAppSecret(data);
}
该注解可以加在接口、接口方法、类和类的方法上,加在类上相当于给类的所有public方法加上了@Transactional注解,默认情况下,加了@Transactional注解的方法,在抛出RuntimeException()异常后会回滚所有的数据库操作。
还可以进行参数配置:
| 参数名称 | 功能描述 |
|---|---|
| readOnly | 设置当前事务只读,例:@Transactional(readOnly=true) |
| rollbackFor | 当抛出对应的异常的时候进行回滚操作,例:@Transactional(rollbackFor={RuntimeException.class, Exception.class})指定抛出RuntimeException()和Exception()异常时回滚。 |
| rollbackForClassName | 当抛出对应的异常的时候进行回滚操作,例:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})指定抛出RuntimeException()和Exception()异常时回滚。 |
| noRollbackFor | 该属性指定对应的异常抛出时不进行回滚,例:@Transactional(noRollbackFor={RuntimeException.class, Exception.class}),表示抛出RuntimeException()和Exception()异常时不进行回滚。 |
| Exception | 该属性指定对应的异常抛出时不进行回滚,例:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”}),表示抛出RuntimeException()和Exception()异常时不进行回滚。 |
相关文章:
MySQL:事务+@Transactional注解
事务 本章从了解为什么需要事务到讲述事务的四大特性和概念,最后讲述MySQL中的事务使用语法以及一些需要注意的性质。 再额外讲述一点Springboot中Transactional注解的使用。 1.为什么需要事务? 我们以用户转账为例,假设用户A和用户B的银行账…...
数字IC手撕代码--低功耗设计 Clock Gating
背景介绍芯片功耗组成中,有高达 40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因 为这些时钟树在系统中具有最高的切换频率,而且有很多时钟 buffer,而且为了最小化时钟 延时,它们通常具有很高的驱动强度。 …...
易基因|m6A RNA甲基化研究的数据挖掘思路:干货系列
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。关于m6A甲基化研究思路(1)整体把握m6A甲基化图谱特征:m6A peak数量变化、m6A修饰基因数量变化、单个基因m6A peak数量分析、m6A peak在基因元件上的分布…...
【微信小程序】-- 页面配置(十八)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
玩好 StarRocks,大厂 offer 接不完!|字节跳动、小红书、京东物流、唯品会、腾讯音乐要的就是你!
求职黄金季即将到来,你准备好迎接你的 dream offer 了吗?StarRocks 自创立以来,一直主张为用户创造极速统一的数据分析新范式,让数据驱动创新,而优秀的大数据人才对推动创新有着至关重要的作用。因此,我们推…...
C# IoC控制反转学习笔记
一、什么是IOC IoC-Invertion of Control,即控制反转,是一种程序设计思想。 先初步了解几个概念: 依赖(Dependency):就是有联系,表示一个类依赖于另一个类。 依赖倒置原则(DIP&a…...
Python解题 - CSDN周赛第33期
本期四道题全考过,题解在网上也都搜得到。。。没有想法,顺手水一份题解吧。 第一题:奇偶排序 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 输入描述:第一行输入整数n。(1<n<…...
Session攻击
Session攻击Session攻击简介主要攻击方式会话预测会话劫持中间人攻击会话固定Session攻击简介 Session对于Web应用是最重要的,也是最复杂的。对于Web应用程序来说,加强安全性的首要原则就是:不要信任来自客户端的数据,一定要进行数据验证以及…...
【Linux】Shell详解
😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…...
汉字找不同隐私协议
本隐私信息保护政策版本:2021 V1 一、重要提示 请您(以下亦称“用户”)在使用本平台App时仔细阅读本协议之全部条款,并确认您已完全理解本协议之规定,尤其是涉及您的重大权益及义务的加粗或划线条款。如您对协议有任…...
CEC2017:斑马优化算法(Zebra Optimization Algorithm,ZOA)求解cec2017(提供MATLAB代码)
一、斑马优化算法 斑马优化算法(Zebra Optimization Algorithm,ZOA)Eva Trojovsk等人于2022年提出,其模拟斑马的觅食和对捕食者攻击的防御行为。 斑马因身上有起保护作用的斑纹而得名。没有任何动物比斑马的皮毛更与众不同。斑…...
【Linux要笑着学】进程创建 | 进程终止 | slab分派器
爆笑教程《看表情包学Linux》👈 猛戳订阅!💭 写在前面:本章我们主要讲解进程的创建与终止。首先讲解进程创建,fork 函数是我们早在讲解 "进程的概念" 章节就提到过的一个函数&#…...
数据资产管理建设思考(二)
关于数据资产管理,近两年是数据治理行业中一个热点话题,当然有我们前面提到的国家的政策支持及方向指引的原因。另一方面我们做数据治理的同行们从学习吸收国外优秀的数据治理理论,进一步在实践中思考如何应用理论,并结合我们国家…...
微软发布多模态版ChatGPT!取名“宇宙一代”
文|CoCo酱Ludwig Wittgenstein曾说过:“我语言的局限,即是我世界的局限”。大型语言模型(LLM)已成功地作为各种自然语言任务的通用接口,只要我们能够将输入和输出转换为文本,就可以将基于LLM的接…...
【学习笔记】深入理解JVM之对象的实例化
参考尚硅谷JVM 102 - 106 集 首发地址:地址 1、JVM对象的实例化 1.1 对象的创建方式 对象有一下几种创建对象的方式 new Object object new Object();Class的newInstance() Object object Object.class.newInstance();Constructor的newInstance(…...
IP协议的漏洞及防护措施
文章目录一、TCP/IP协议族二、IP协议三、IP协议的安全问题及防护措施一、TCP/IP协议族 二、IP协议 网际协议(Internet Protocol,IP)是TCP/IP协议族的核心,也是网际层最重要的协议。 IP数据报由首部和数据两部分组成;…...
Linux命令·mkdir
linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。1.命令格式:mkdir [选项] 目录...2.命令功能:通过 mkdir 命令可以实现…...
智能家居项目(八)之树莓派+摄像头进行人脸识别
目录 1、编辑Camera.c 2、编辑contrlDevices.h 3、编辑mainPro.c 4、进行编译: 5、运行结果: ./test1 6、项目图片演示 智能家居项目(七)之Libcurl库与HTTPS协议实现人脸识别_Love小羽的博客-CSDN博客 经过上一篇文章&…...
渗透测试之地基服务篇:无线攻防之钓鱼无线攻击(上)
简介 渗透测试-地基篇 该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。 请注意 : 本文仅用于技术讨论与研究,对于所有笔记中复现…...
「ABAP」一文带你入门OPEN SQL中的SELECT查询(附超详细案例解析)
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
python可视化:俄乌战争时间线关键节点与深层原因
俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...
