【MySQL】事务 详解
事务 详解
- 一. 为什么使用事务
- 二. 事务的概念
- 三. 使用
- 四. 事务的特性
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
- 五. 事务并发所带来的问题
- 脏读问题
- 不可重复读
- 幻(影)读
- 六. 事务隔离级别
一. 为什么使用事务
假如说你要进行转账, 比如转给 张三 50元,先从你的账户里面扣除 50, 准备给 张三账户 + 50 时,数据库由于种种原因 挂了,没加上,此时 50 元 凭空消失了, 那么这就是一个比较悲伤的故事了,这种事情当然不能发生。
drop table if exists accout;
create table accout(id int primary key auto_increment,name varchar(20) comment '账户名称',money decimal(11,2) comment '金额'
);insert into accout(name, money) values('阿里巴巴', 5000),('四十大盗', 1000);
比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
假如执行完第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是四十大盗的账户上没有增加金额。
解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。
二. 事务的概念
事务: 指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
事务的目的: 把若干个独立的操作打包成一个整体,这个整体要么全部成功执行, 要么一点都不执行。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
有时前一个 SQL 是为了给后一个 SQL 提供支持,若后一个 SQL 不执行或者执行出现问题了, 前一个 SQL 也就失去意义了。
三. 使用
(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
start transaction;-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';commit;
四. 事务的特性
ACID
Atomicity: 原子性
Consistency: 一致性
Isolation: 隔离性
Durability: 持久性
原子性(Atomicity)
原子性: 任务不能被再细分,事务要么全部成功执行,要么一点也不执行,不会出现中间状态。
比如上面的转账例子, 不会出现 A账户 -2000, 结果数据库崩了/程序崩了/断电了, B 的账户并没有 + 2000 而导致的中间状态。
原子性如何保证 ?
该执行还得执行, 无法预知失败。
当出现执行失败后,由数据库自动进行一些 “还原” (回滚rollback)工作, 消除前面 已经执行过 的 SQL 带来的影响,使得看起来与没有执行一样。
比如:
当执行第二个 SQL 出现失败时,数据库会还原之前的操作,上一个是 +, 那么就 -, 是 * 就 / 。
数据库如何知道还原成哪个值呢?
日志, 数据库会把执行数据库的每个操作记录下来,整个记录过程搭配了 日志+数据库内置的一些表 来完成。
既然能还原,是不是就可以大胆的删库 了 ?
数据库想要记录详细的操作需要消耗大量的时间和空间,所以这个记录一定不会存储那么久,可能数据库是经过好几年沉淀出来的结果,但是日志只是记录最近几天的,所以还得依赖 权限控制 和 数据备份。
一致性(Consistency)
事务在执行前后,数据库从一个一致的状态转换到另一个一致的状态。这意味着事务必须遵循预定义的规则和约束,以确保数据的完整性。
如果事务违反了任何约束,它将被回滚,数据库不会处于不一致的状态。
隔离性(Isolation)
隔离性指的是多个事务同时运行时,每个事务都应该被视为独立的,不应该受到其他事务的干扰。
这意味着在并发执行的情况下,一个事务的操作不会对其他事务产生影响,直到事务提交为止。
数据库系统使用锁和其他机制来实现隔离性。
持久性(Durability)
持久性确保一旦事务提交成功,其结果将永久保存在数据库中,即使系统发生故障或重启。这意味着事务的结果不会因为系统崩溃而丢失,数据库系统必须将数据持久地写入磁盘或其他持久存储介质中。
总结:
事务的四个特性确保了数据库事务的可靠性和一致性,使得数据库系统能够有效地管理并发操作,同时保护数据免受损坏或丢失。但严格的ACID特性有时会对性能产生一定的开销,因此在某些情况下,可能需要权衡ACID特性与性能之间的关系。
五. 事务并发所带来的问题
并发: 包含并行和广义的并发。
当并发执行多个事务时, 尤其当这多个事务在尝试修改/读取同一份数据时,容易出现一些问题。
事务的隔离级别就是在解决该问题。
脏读问题
事务 A 在对某个数据进行修改,修改的时候,事务 B 读取了这个数据,此时事务 B 读取到的很可能只是一个临时的中间结果,不是最终结果, 那么此时 B 就是读到了 “脏数据”。
出现脏读的原因:
事务和事务之间没有隔离,加上一些限制,就可有效避免脏读。
解决脏读:
给写操作加锁,修改过程中, 不允许别人读, 修改之后才能读(解锁)。
(注意一旦加锁, 事务之间隔离性提高, 并发度降低)
不可重复读
不可重复读问题: 在一个事务中,包含多次读操作,多次读操作读出来的结果不一致
解决脏读问题时,只是约定写加锁, 写时不能读, 但是 读时还能写,所以还存在不可重复读问题。
这个问题好比:通过码云读代码,读的时候别人修改并提交了,我们刷新一下,代码变了。
解决:
约定读时也加锁,读时不能进行修改操作, 读时,其他事务能读但不能修改。
事务的隔离性进一步提高,并发性进一步降低
幻(影)读
幻读问题: 一个事务执行过程中进行多次查询,多次查询的结果集不一样,
结果集多了,这是一种特殊的不可重复读问题。
本例就是读代码时,代码数量变了,本来只有一个 A.java, 后面读取的时候发现又多了 B.java
注意:
幻读出现的场景:
第一:事务的隔离级别为可重复读。
第二:幻读仅专指新插入的行,在范围查询中,后一次查询出现了新的数据行。
(因为数据库中原本没有这个数据,当然就无法加锁了,所以会出现新的数据, 而因为读时不能写,所以不会删除数据)。
解决:
彻底串行化,读的时候不要写任何代码。
(但是在MySQL的InnoDB引擎中,通过间隙锁(gap lock)+行锁组成的next-key lock,在可重复读级别下解决了幻读的问题。参考链接:前阿里数据库专家总结的MySQL里的各种锁(下篇))
串行化,隔离级别最高,并发度最低(其实已经串行化,没有并发了),数据最可靠,但是执行速度最慢。
所以,并发性和隔离性不可兼得。
可根据实际需要调整数据库隔离级别,通过不同的隔离级别,控制事务间的隔离性和并发程度。
六. 事务隔离级别
(MySQL 默认隔离级别为 repeatable read, 通过修改 my.ini 文件可以设置当前隔离级别。)
好啦 ! 以上就是对 MySQL 事务的讲解, 希望能帮到你 !
评论区欢迎指正 !
相关文章:

【MySQL】事务 详解
事务 详解 一. 为什么使用事务二. 事务的概念三. 使用四. 事务的特性原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) 五. 事务并发所带来的问题脏读问题…...

爬虫到底难在哪里?
目录 爬虫到底难在哪里 怎么学习爬虫 注意事项 爬虫工具 总结 学习Python爬虫的难易程度因人而异,对于具备编程基础的人来说,学习Python爬虫并不困难。Python语言本身比较简单易学,适合初学者使用。 爬虫到底难在哪里 爬虫的难点主要包…...
linux常用命令行整理
1、linux的以及目录 bin 二进制可执行文件sbin 二进制可执行文件(root用户权限)etc 系统管理和配置文件,例如常见host文件home 用户文件的根目录usr 用户存放系统应用程序(共享系统资源)opt 可选的应用程序proc 虚拟文件系统root 超级用户dev 存放设备文件mnt 系统管理员安装临…...
python字符串相关
python字符串相关 一、reverse() 函数 只能反转 列表二、reversed() 反转元组字符串等等 返回迭代器三、join和reversed反转字符串四、join串联字符串(join连接对象仅限字符串、储存字符串的元组、列表、字典)数字对象可通过str()转化为字符串⭐对象为字…...

JavaScript学习笔记01
JavaScript笔记01 什么是 JavaScript JavaScript 是一门世界上最流行的脚本语言,它是一种弱类型的脚本语言,其代码不需要经过编译,而是由浏览器解释运行,用于控制网页的行为。 发展历史 参考:JavaScript的起源故事…...

golang 通用的 grpc http 基础开发框架
go-moda golang 通用的 grpc http 基础开发框架仓库地址: https://github.com/webws/go-moda仓库一直在更新,欢迎大家吐槽和指点 特性 transport: 集成 http(echo、gin)和 grpc。tracing: openTelemetry 实现微务链路追踪pprof: 分析性能config: 通用…...

FSK解调技术的FPGA实现
本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 一、FSK信号的解调原理 FSK信号的解调也有非相干和相干两种,FSK信号可以看作是用两个频率源交替传输得到的,所以FSK的接收机由…...

Matlab图像处理-高斯低通滤波器
高通滤波 图像的边缘、细节主要位于高频部分,而图像的模糊是由于高频成分比较弱产生的。高通滤波就是为了高消除模糊,突出边缘。因此采用高通滤波器让高频成分通过,消除低频噪声成分削弱,再经傅里叶逆变换得到边缘锐化的图像。 …...

文件上传之图片马混淆绕过与条件竞争
一、图片马混淆绕过 1.上传gif imagecreatefromxxxx函数把图片内容打散,,但是不会影响图片正常显示 $is_upload false; $msg null; if (isset($_POST[submit])){// 获得上传文件的基本信息,文件名,类型,大小&…...
代码随想录二刷day16
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣104. 二叉树的最大深度二、力扣559. N 叉树的最大深度三、力扣111. 二叉树的最小深度三、力扣力扣222. 完全二叉树的节点个数 前言 一、力扣104. 二叉树…...

【开发】安防监控/视频存储/视频汇聚平台EasyCVR优化播放体验的小tips
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成,…...
力扣(LeetCode)算法_C++—— 只出现一次的数字
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入࿱…...

Windows配置SonarQube代码审查工具详细步骤(附带IDEA SonarLint插件使用)
文章目录 环境说明以及准备一. SonarQube的下载与安装二. 添加SonarQube项目三. 使用Maven命令上传代码到SonarQube四. IDEA安装SonarLint插件 环境说明以及准备 本篇博客使用的SonarQube版本为9.8,注意JDK 1.8已经不能支持 NameVersionDownLoad LinkSonarQube9.8…...

【Unity3D】UI Toolkit元素
1 前言 UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery、Debugger,UI Toolkit容器 中介绍了 VisualElement、ScrollView、ListView、GroupBox 等容器,UI Toolkit样式选择器 中介绍了简单选择器、复杂选择器、伪类选择器等样式选择器,…...

Task :app:compileDebugKotlin FAILED
gradle.properties 里面加上 android.enableJetifiertrue...

Android——数据存储(一)(二十一)
1. 数据存储 1.1 知识点 (1)掌握Android数据存储的分类; (2)可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言,Android一共提供了5个数据存储的方式:SharedPrefe…...
机器学习课后习题 ---数学基础回顾
(一)选择题 1.函数y=1/(x+1)是 A.偶函数 B.奇函数 C.单调函数 D.无界函数 2.设f(sin(x/2)=cosx+1,则f(x)为() A.2x-2 B.2-2x C.1+2 …...

CS420 课程笔记 P4 - 以16进制形态编辑游戏文件
文章目录 IntroductionFinding save filesStringsUnicodeExample!Value searchHealth searchConclusion Introduction 这节课我们将学习编辑十六进制,主要用于编辑保存文件,但十六进制编辑涉及的技能可以很好地转移到: Save file editingRe…...

计算机毕设之Python的高校成绩分析(含文档+源码+部署)
本系统阐述的是一个高校成绩分析系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。…...

【Sentinel】核心API-Entry与Context
文章目录 一、Entry1、Entry的声明2、使用API自定义资源3、基于SentinelResource注解标记资源 二、Context1、Context介绍2、Context的初始化3、AbstractSentinelInterceptor4、ContextUtil 一、Entry 1、Entry的声明 默认情况下,Sentinel会将controller中的方法作…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...