当前位置: 首页 > news >正文

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余额为500C=read©读取用户C的余额,当前C的余额为500
A=A-200A的余额减少200,当前A的余额为300
C=C-200C的余额减少200,当前C的余额为300
Write(A)将A的变化写回数据库Write©将C的变化写回数据库
B=Read(B)读取用户B的余额,当前B余额为500
B=Read(B)读取用户B的余额,当前B余额为500
B=B+200B的余额增加200,当前B的余额为700B=B+200B的余额增加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开启状态,如果不显示的使用BEGINSTART TRANSACTION开启事务,那么每一条语句都会算作一个单独的事务进行提交。

如果设置autocommit为off,那么运行的所有语句必须COMMIT后才能成功更新数据库。

4.6 隐式提交

当使用START TRANSACTIONBEGIN开启事务后,在COMMIT之前使用某些语句可能会导致事务偷偷被提交了,这就叫隐式提交。会导致事务隐式提交的语句有如下:

  • DDL语句:

    CREATEALTERDROP等语句修改数据库对象时,就会隐式提交前面语句所属的事务。

  • 隐式的使用或修改了mysql数据表。

    比如:ALTER USERCREATE USERDROP USERGRANTRENAME USERREVOKESET PASSWORD等。

  • 事务控制或关于锁定的语句:

    • 在事务COMMIT之前又使用了一次START TRANSACTIONBEGIN会隐式提交。
    • 使用LOCK TABLESUNLOCK TABLES也会隐式提交。
  • 关于MySQL复制的一些语句:

    SRART SLAVESTOP SLAVERESET SLAVECHANGE MASTER TO等语句也会隐式提交前面语句所属的事务。

  • 其他语句:

    ALALYZY TABLECHANGE INDEXCHECK TABLEFLUSHLOAD INDEX INTO CHANGEOPTIMIZE TABLEREPAIR TABLERESET等语句。

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期

本期四道题全考过&#xff0c;题解在网上也都搜得到。。。没有想法&#xff0c;顺手水一份题解吧。 第一题&#xff1a;奇偶排序 给定一个存放整数的数组&#xff0c;重新排列数组使得数组左边为奇数&#xff0c;右边为偶数。 输入描述&#xff1a;第一行输入整数n。(1<n<…...

Session攻击

Session攻击Session攻击简介主要攻击方式会话预测会话劫持中间人攻击会话固定Session攻击简介 Session对于Web应用是最重要的&#xff0c;也是最复杂的。对于Web应用程序来说&#xff0c;加强安全性的首要原则就是:不要信任来自客户端的数据&#xff0c;一定要进行数据验证以及…...

【Linux】Shell详解

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…...

汉字找不同隐私协议

本隐私信息保护政策版本&#xff1a;2021 V1 一、重要提示 请您&#xff08;以下亦称“用户”&#xff09;在使用本平台App时仔细阅读本协议之全部条款&#xff0c;并确认您已完全理解本协议之规定&#xff0c;尤其是涉及您的重大权益及义务的加粗或划线条款。如您对协议有任…...

CEC2017:斑马优化算法(Zebra Optimization Algorithm,ZOA)求解cec2017(提供MATLAB代码)

一、斑马优化算法 斑马优化算法&#xff08;Zebra Optimization Algorithm&#xff0c;ZOA&#xff09;Eva Trojovsk等人于2022年提出&#xff0c;其模拟斑马的觅食和对捕食者攻击的防御行为。 斑马因身上有起保护作用的斑纹而得名。没有任何动物比斑马的皮毛更与众不同。斑…...

【Linux要笑着学】进程创建 | 进程终止 | slab分派器

爆笑教程《看表情包学Linux》&#x1f448; 猛戳订阅&#xff01;​​​​​​​​​​​​&#x1f4ad; 写在前面&#xff1a;本章我们主要讲解进程的创建与终止。首先讲解进程创建&#xff0c;fork 函数是我们早在讲解 "进程的概念" 章节就提到过的一个函数&#…...

数据资产管理建设思考(二)

关于数据资产管理&#xff0c;近两年是数据治理行业中一个热点话题&#xff0c;当然有我们前面提到的国家的政策支持及方向指引的原因。另一方面我们做数据治理的同行们从学习吸收国外优秀的数据治理理论&#xff0c;进一步在实践中思考如何应用理论&#xff0c;并结合我们国家…...

微软发布多模态版ChatGPT!取名“宇宙一代”

文&#xff5c;CoCo酱Ludwig Wittgenstein曾说过&#xff1a;“我语言的局限&#xff0c;即是我世界的局限”。大型语言模型&#xff08;LLM&#xff09;已成功地作为各种自然语言任务的通用接口&#xff0c;只要我们能够将输入和输出转换为文本&#xff0c;就可以将基于LLM的接…...

【学习笔记】深入理解JVM之对象的实例化

参考尚硅谷JVM 102 - 106 集 首发地址&#xff1a;地址 1、JVM对象的实例化 1.1 对象的创建方式 对象有一下几种创建对象的方式 new Object object new Object();Class的newInstance() Object object Object.class.newInstance();Constructor的newInstance&#xff08…...

IP协议的漏洞及防护措施

文章目录一、TCP/IP协议族二、IP协议三、IP协议的安全问题及防护措施一、TCP/IP协议族 二、IP协议 网际协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;是TCP/IP协议族的核心&#xff0c;也是网际层最重要的协议。 IP数据报由首部和数据两部分组成&#xff1b…...

Linux命令·mkdir

linux mkdir 命令用来创建指定的名称的目录&#xff0c;要求创建目录的用户在当前目录中具有写权限&#xff0c;并且指定的目录名不能是当前目录中已有的目录。1&#xff0e;命令格式&#xff1a;mkdir [选项] 目录...2&#xff0e;命令功能&#xff1a;通过 mkdir 命令可以实现…...

智能家居项目(八)之树莓派+摄像头进行人脸识别

目录 1、编辑Camera.c 2、编辑contrlDevices.h 3、编辑mainPro.c 4、进行编译&#xff1a; 5、运行结果&#xff1a; ./test1 6、项目图片演示 智能家居项目&#xff08;七&#xff09;之Libcurl库与HTTPS协议实现人脸识别_Love小羽的博客-CSDN博客 经过上一篇文章&…...

渗透测试之地基服务篇:无线攻防之钓鱼无线攻击(上)

简介 渗透测试-地基篇 该篇章目的是重新牢固地基&#xff0c;加强每日训练操作的笔记&#xff0c;在记录地基笔记中会有很多跳跃性思维的操作和方式方法&#xff0c;望大家能共同加油学到东西。 请注意 &#xff1a; 本文仅用于技术讨论与研究&#xff0c;对于所有笔记中复现…...

「ABAP」一文带你入门OPEN SQL中的SELECT查询(附超详细案例解析)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…...

【搞透C语言指针】那年我双手插兜, 不知道指针是我的对手

☃️内容专栏&#xff1a;【C语言】进阶部分 ☃️本文概括&#xff1a; 征服C语言指针&#xff01;一篇文章搞清楚指针的全部要点。 ☃️本文作者&#xff1a;花香碟自来_ ☃️发布时间&#xff1a;2023.3.3 目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义…...

如何从 Android 手机上的 SD 卡恢复已删除的照片

为了扩展手机的存储空间&#xff0c;很多人都会在安卓手机上插入一张SD卡来存储一些大文件&#xff0c;比如电影、照片、视频等。虽然SD卡给我们带来了很大的方便&#xff0c;但我们还是避免不了数据丢失一些事故造成的。您是否正在为 SD 卡上的照片意外丢失而苦恼&#xff1f;…...

01-前端-htmlcss

文章目录HTML&CSS1&#xff0c;HTML1.1 介绍1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标签1.3.5 段落标签1.3.6 加粗、斜体、下划线标签1.3.7 居中标签1.3.8 案例1.4 图片、音频、视频标签1.5 超链接标签1.6 列表标签1.7 表格标签1.8 布…...

【YOLO系列】YOLOv5超详细解读(网络详解)

前言 吼吼&#xff01;终于来到了YOLOv5啦&#xff01; 首先&#xff0c;一个热知识&#xff1a;YOLOv5没有发表正式论文哦~ 为什么呢&#xff1f;可能YOLOv5项目的作者Glenn Jocher还在吃帽子吧&#xff0c;hh 目录 前言 一、YOLOv5的网络结构 二、输入端 &#xff08;1…...

从 ChatGPT 爆火回溯 NLP 技术

ChatGPT 火遍了全网&#xff0c;多个话题频频登上热搜。见证了自然语言处理&#xff08;NLP&#xff09;技术的重大突破&#xff0c;体验到通用技术的无限魅力。GPT 模型是一种 NLP 模型&#xff0c;使用多层变换器&#xff08;Transformer&#xff09;来预测下一个单词的概率分…...

面了 6 家大厂,并拿下 5 家 offer,进大厂好像也没有那么困难吧....

前言 二月份的时候因为换工作的缘故&#xff0c;陆续参加了华为、蚂蚁、字节跳动、PDD、百度、Paypal 的社招面试&#xff0c;除了字节跳动流程较长&#xff0c;我主动结束面试以外&#xff0c;其他的都顺利拿到了 Offer。 最近时间稍微宽裕点了&#xff0c;写个面经&#xf…...

四、Spring对IoC的实现

1.IoC 控制反转 控制反转是一种思想。控制反转是为了降低程序耦合度&#xff0c;提高程序扩展力&#xff0c;达到OCP原则&#xff0c;达到DIP原则。控制反转&#xff0c;反转的是什么&#xff1f; 将对象的创建权利交出去&#xff0c;交给第三方容器负责。将对象和对象之间关系…...

Java语言如何求平方根

问题 在编程时&#xff0c;会遇到求平方根的问题&#xff0c;本次问题讲到如何使用Java来求解平方根。 方法 使用java.lang.Math类的sqrt(double)方法求平方根。Math是java.lang包中的类&#xff0c;所以就可以直接使用这个类。Double为对象中的基本类型。例如求正整数16的平方…...

C++20中的span容器

一.span容器 span 是 C20 中引入的一个新的标准容器&#xff0c;它用于表示连续的一段内存区间&#xff0c;类似于一个轻量级的只读数组容器。 span 是一个轻量级的非拥有式容器&#xff0c;它提供了对连续内存的引用。 span 的主要用途是作为函数参数&#xff0c;可以避免不…...

codeforces周赛div3#855记录

目录 总结 一&#xff0c;A. Is It a Cat? 二&#xff0c;B. Count the Number of Pairs 三&#xff0c;C1. Powering the Hero (easy version) 四&#xff0c;C2. Powering the Hero (hard version) 总结 真羡慕ACM校队的同学&#xff0c;能AC七八题&#xff0c;甚至ak …...

wordpress4.9.3漏洞/产品网络推广深圳

在很多情况下&#xff0c;我们需要通过树列表进行数据的展示&#xff0c;如一些有层次关系的数据&#xff0c;通过有层级的展示&#xff0c;能够使用户更加直观查看和管理相关的数据。在一般Winform开发的情况下&#xff0c;可以使用微软的TreeView控件&#xff0c;也可以使用D…...

wordpress form manager 中文/网站排名顾问

怎么把pdf拆分成一页一个文件&#xff1f;我们经常会遇到PDF文档里面的页面比较多&#xff0c;但是有时候我们只需要其中的一部分内容&#xff0c;该怎么办呢&#xff0c;这个时候就需要把这个PDF文件拆分成多个pdf文件了&#xff0c;或者按页面&#xff0c;或者只需要其中一两…...

做安利能开个人网站/优化一下

1.什么是线程?什么是进程?它们之间的关系?简单说一个进程可以由多个线程组成,一个操作系统可以多个进程,它们都是可以同时进行工作的.2.什么是下载?如何多线程进行下载?如何断点续传?广义上说&#xff0c;凡是在屏幕上看到的不属于本地计算机上的内容&#xff0c;皆是通过…...

html网站如何做seo/关键词优化排名的步骤

常用的表单验证指令 1. 必填项验证 某个表单输入是否已填写&#xff0c;只要在输入字段元素上添加HTML5标记required即可&#xff1a; <input type"text" required /> 2. 最小长度 验证表单输入的文本长度是否大于某个最小值&#xff0c;在输入字段上使用指令…...

网站做导航设计的作用是什么意思/自己做一个网站需要什么

Overall summary:Final result: SQL Server 安装失败。若要继续操作&#xff0c;请调查失败原因&#xff0c;更正问题&#xff0c;卸载 SQL Server&#xff0c;然后重新运行 SQL Server 安装程序。Exit code (Decimal): -2068643839Exit facility c…...

java做直播网站有哪些/国外引擎搜索

HTML朋不功事做时次功好来多这开制的请一例农在 DOM增加、删除和替换节是能览调不页新代些事几求事都时学下是事点例&#xff1a;向一如分算需上来处一定迹面数一跳这件我子作div里面创建新的新直能分支调二浏页器朋代说&#xff0c;事刚需求HTML元素HTML代码遇新是直朋能到&am…...