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 TABLE
S也会隐式提交。
- 在事务
-
关于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开发顾问。在学习工作中,我通常使用偏后…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...