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开发顾问。在学习工作中,我通常使用偏后…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
