MySQL事务的ACID四大特性以及实践问题

文章目录

      • 事务演示
        • 基本操作
        • 操作方式二
      • 四大特性ACID
      • 并发事务存在的问题
      • 并发事务隔离级别
      • 实现事务的原理
      • 事务的重要性


在这里插入图片描述

事务是逻辑上一组操作的集合,事务会把所有操作作为一个整体一起向系统 提交 或 撤销 操作请求,即这些操作要么同时成功,要么同时失败。

事务演示

基本操作
-- 1. 查询张三账户余额
select * from account where name = '张三';
-- 2. 将张三账户余额-1000
update account set money = money - 1000 where name = '张三';
-- 此语句出错后张三钱减少但是李四钱没有增加
模拟sql语句错误
-- 3. 将李四账户余额+1000
update account set money = money + 1000 where name = '李四';

-- 查看事务提交方式
SELECT @@AUTOCOMMIT;
-- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
SET @@AUTOCOMMIT = 0;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

-- 设置手动提交后上面代码改为:
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;

操作方式二

开启事务:
START TRANSACTION 或 BEGIN TRANSACTION;
提交事务:
COMMIT;
回滚事务:
ROLLBACK;

操作实例:

start transaction;
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;

四大特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

并发事务存在的问题

问题描述
脏读一个事务读到另一个事务还没提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同(侧重内容数据的修改)
幻读一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在(侧重新增或删除,插入数据读到多了一行)

不可重复读:破坏了一致性,update 和 delete
幻读:破坏了一致性 insert

不可重复读和幻读的区别
● 不可重复读的重点是内容修改或者记录减少比如多次读取一条记录发现其中某些记录的值被修改;
● 幻读的重点在于记录新增比如多次执行同一条查询语句(DQL)时,发现查到的记录增加了。
幻读其实可以看作是不可重复读的一种特殊情况,
单独把区分幻读的原因主要是解决幻读和不可重复读的方案不一样。

举个例子:执行 delete 和 update 操作的时候,可以直接对记录加锁,保证事务安全。
而执行 insert 操作的时候,由于记录锁(Record Lock)只能锁住已经存在的记录,为了避免插入新记录,需要依赖间隙锁(Gap Lock)。
也就是说执行 insert 操作的时候需要依赖 Next-Key Lock(Record Lock+Gap Lock)
进行加锁来保证不出现幻读。

这三个问题的详细演示:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=55cd

并发事务隔离级别

读未提交:原理:直接读取数据,不能解决任何并发问题

读已提交:读操作不加锁,写操作加排他锁,解决了脏读。原理:利用MVCC实现,每一句语句执行前都会生成Read View(一致性视图)

可重复读:MVCC实现,只有事务开始时会创建Read View,之后事务里的其他查询都用这个Read View。解决了脏读、不可重复读,快照读(普通查询,读取历史数据)使用MVCC解决了幻读,当前读(读取最新提交数据)通过间隙锁解决幻读(lock in share mode、for update、update、detete、insert),间隙锁在可重复读下才生效。(默认隔离级别)

可串行化:原理:使用锁,读加共享锁,写加排他锁,串行执行

总结:
读已提交和可重复读实现原理就是MVCC Read View不同的生成时机。
可重复读只在事务开始时生成一个Read View,之后都用的这个;读已提交每次执行前都会生成Read View。

MySQL 在 InnoDB下是默认可重复读的隔离级别,加上 MVCC机制 解决了脏读、不可重复读、幻读的问题。

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(默认)××
Serializable×××
  • √ 表示在当前隔离级别下该问题会出现
  • Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差
  • 在 MySQL 的 InnoDB 引擎下,Repeatable Read 其实不会发生幻读(MVCC机制)。
  • 自 MySQL5.5 之后,默认的存储引擎是 Innodb。

查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别:
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };
SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效

实现事务的原理

MySQL 中的 ACID 实现原理:
原子性:undolog(记录事务开始前的老版本数据,可以保证原子操作,回滚,实现MVCC版本链)
隔离性:读写锁 、MVCC
持久性:redo log(记录事务开启后对数据的修改,可用于crash-safe)


事务的重要性

MySQL 中事务的重要性体现在以下几个关键方面

  • 数据完整性:
    事务能够确保一组数据库操作要么全部成功执行,要么全部不执行(即原子性)。例如,在转账过程中,需要同时减少一个账户的余额并增加另一个账户的余额,这两步操作必须作为一个不可分割的整体来完成。如果其中任何一步失败,则整个事务应当回滚以保持数据一致性。
  • 一致性保证:
    在事务执行前后,数据库状态始终保持一致,即使在多个并发事务同时进行时也是如此。每个事务都必须从一个一致性的状态转换到另一个一致性的状态,这意味着事务的结果必须遵循所有的业务规则和约束条件。
  • 隔离性:
    多个并发事务之间相互独立,互不影响。通过事务隔离级别控制(如读未提交、读已提交、可重复读、串行化等),可以防止脏读、不可重复读和幻读等问题,确保每个事务看到的数据视图都是稳定的。
  • 持久性:
    当事务提交后,对数据库的修改是永久性的,即使系统出现故障(如宕机)也能保证这些修改不会丢失。这是通过日志记录和恢复机制来实现的。
  • 错误恢复与回滚:
    如果在事务处理过程中发生错误或异常,可以通过回滚事务撤销所有已执行的操作,使数据库回到事务开始前的状态,从而避免因部分操作成功而导致的数据混乱。
    综上所述,事务管理是关系型数据库系统中不可或缺的一部分,它为复杂的数据操作提供了可靠的环境,尤其对于涉及财务交易、库存管理等高要求一致性和完整性的场景至关重要。

在这里插入图片描述



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/722560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十、数据结构(图的基础)

文章目录 什么是图图的分类图算法的复杂度 图的模拟怎么储存一个图邻接矩阵:邻接矩阵的定义方式优劣分析 邻接表优劣分析实现代码 链式前向星实现代码优劣分析 图的遍历某个点的连通性拓扑排序1.拓扑排序的概念2.图的入度和出度3.基于 B F S BFS BFS的拓扑排序复杂度…

面向对象程序设计:运算符重载习题

宋桂琴白皮书项目2(P8)二、1 题目: 编写有理数(即分数,包括整数类型的分子,分母)类,并进行运算符重载,编写运算符“”,“-”,“*”,“…

机器学习课程复习——线性回归

Q:回归和分类的区别? 回归是连续的,分类是离散的 Q:用最小二乘法对线性回归模型进行参数估计思路 例题

七、(正点原子)Linux并发与竞争

Linux是多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。 一、并发与竞争 1、简介 并发就是多个…

安装docker与docker-compose

1. 项目目标 (1)安装docker (2)安装docker-compose (3)配置镜像源 2. 项目准备 centos7.9系统 3. 项目实施 3.1. 安装docker 安装基本命令: yum -y install wget yum -y install vim y…

Matlab绘制三维图像(论文插图)

Matlab绘制三维图像 hfigure; % 创建 surf surf(PHDeformed_1Unwrap); shading interp;lightangle(45,75); % 创建 zlabel zlabel(Z(phase/rad),FontWeight,bold,FontName,Times New Roman); % 创建 ylabel ylabel(Y(pixel),FontWeight,bold,FontName,Times New Roman); % 创建…

汇编基础之使用vscode写hello world

汇编语言(Assembly Language) 概述 汇编语言(Assembly Language)是一种低级编程语言,它直接对应于计算机的机器代码(machine code),但使用了更易读的文本符号。每台个人计算机都有…

B端系统的UI框架选择,不要输在了起跑线,如何破?

所谓成也框架、败也框架,框架就是这么的优点和缺点鲜明,市面上的框架多如牛毛,谁家的最优秀呢?为何框架搞出来的UI界面同质化呢,如何避免这种情况,如何在框架的基础上进一步提升颜值和体验呢,本…

AI搜索工具,提升你的工作效率

当我们需要查询某个内容的时候,除了可以通过搜索引擎来查找,还可以通过AI搜索工具来查找。AI搜索工具会智能的从网络信息中查找答案并整理后给我们结果。除了搜索结果,AI搜索工具还可以用来帮我们创作内容,比如你需要写一篇文章&a…

2024中国低碳供应链物流创新发展报告

来源:罗戈研究 近期历史回顾:

STM32--IAP程序升级实验

1. STM32程序升级方法 1.1 ST-link / J-link下载 将编译生成的hex文件使用ST-Link/J-Link工具直接下载进 Flash 即可。Keil中点击下载也能一键下载。下载后的代码会存放在Flash的起始地址0x0800 0000处。 简单补充一句,bin文件和hex文件的区别: bin文…

数据可视化作业一:江西人口数据可视化

目录 作业要求 一、江西省各地市(年末)常住人口分布地图绘制 1.1 代码实现 1.1.1采用Map实现 1.1.2 采用Geo实现 1.2 绘制结果 二、江西省各地市常住人口分布饼状图绘制 2.1代码实现 2.2 绘制结果 三、江西省各地市常住人口城镇化率柱状图绘制 …

7_机械臂工作台坐标系理论_一般坐标系的映射_2

1、一般坐标系的映射 经常有这种情况,我们已知矢量相对坐标系{B}的描述,并且想求出它相对于另一个坐标系{A}的描述。结合上次的理论和平时对机械臂使用的经验,使用3点法标定机械臂工作台坐标系(我习惯称为用户坐标系,下面称为用户…

混剪视频的素材一般去哪找?做短视频素材混剪网站库分享!

在短视频和自媒体的快速发展时代,混剪视频已成为许多创作者展现创意和吸引观众的重要手段。制作高质量的混剪视频离不开优质素材的支持。今天,我将为大家推荐几个优秀的素材网站,帮助你轻松获取制作混剪视频所需的多样素材,提升视…

PyQt5.QtWidgets常用函数及说明

目录 PyQt5.QtWidgets简介常用函数设置窗口标题和固定大小创建垂直布局创建进度条 PyQt5.QtWidgets简介 PyQt5.QtWidgets 是 PyQt5 库中的一个模块,它包含了用于创建图形用户界面(GUI)的各种小部件(widgets)。这些小部…

Gobject tutorial 六

Instantiatable classed types Initialization and destruction 类型的实例化是通过函数g_tpye_create_instance()实现的。这个函数首先会查找与类型相关的GTypeInfo结构体,之后,查询结构体中的instance_size和 instance policy即 n_preallocs(在 2.10版…

陶建辉入选 2023 年度“中国物联网行业卓越人物榜”

在这个技术飞速发展的时代,物联网行业作为推动社会进步的重要力量,正在不断地演化和革新。近日,中国智联网生态大会暨“2023 物联之星”年度榜单颁奖典礼在上海浦东举行。现场公布了拥有物联网行业奥斯卡奖之称的 ——“物联之星 2023 中国物…

深度 | OpenAI COO闭门访谈:大模型已至,企业如何落地?

图片来源:OpenAI Z Highlights: 仅仅允许公司单一部门使用互联网非常可笑。类似地,给所有员工开放AI权限将会是最大的催化剂。当前阶段的AI企业级部署,要让员工熟悉AI工具的使用方式,让他们将工作流程与模型的功能紧密…

九、数据结构(并查集)

文章目录 1.并查集操作的简单实现2.解决问题3. 并查集优化3.1 合并的优化3.2查询优化3.3查询优化2 通常用“帮派”的例子来说明并查集的应用背景&#xff1a;在一个城市中有 n ( n < 1 0 6 ) n(n < 10^6) n(n<106)个人&#xff0c;他们分成不同的帮派&#xff0c;给出…

[算法刷题积累] 两数之和以及进阶引用

两数之和很经典&#xff0c;通常对于首先想到的就是暴力的求解&#xff0c;当然这没有问题&#xff0c;但是我们如果想要追求更优秀算法&#xff0c;就需要去实现更加简便的复杂度。 这里就要提到我们的哈希表法: 我们可以使用unordered_map去实现&#xff0c;也可以根据题目&a…