一文讲清楚 MySQL 事务隔离级别和实现原理

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了

文章正文

一、MySQL 事务隔离级别

MySQL 支持四种事务隔离级别,分别是:

  1. 读未提交(Read Uncommitted)
  • 最低的隔离级别,事务可以读取其他事务未提交的数据。
  • 可能导致脏读、不可重复读和幻读。
  1. 读已提交(Read Committed)
  • 事务只能读取其他事务已提交的数据。
  • 避免了脏读,但可能导致不可重复读和幻读。
  1. 可重复读(Repeatable Read)
  • 确保在同一事务中多次读取同一数据时,结果一致。
  • 避免了脏读和不可重复读,但可能导致幻读。
  1. 串行化(Serializable)
  • 最高的隔离级别,事务串行执行,避免了脏读、不可重复读和幻读。
  • 但性能最差,因为事务需要排队执行。

二、事务隔离级别的实现原理

MySQL 通过 多版本并发控制(MVCC, Multi-Version Concurrency Control)锁机制 来实现事务隔离级别。

  1. MVCC
  • MVCC 通过为每行数据维护多个版本来实现并发控制。
  • 每个事务在开始时都会获得一个唯一的事务 ID(Transaction ID),事务只能看到在该事务开始之前已经提交的数据版本。
  • 通过这种方式,MVCC 实现了读操作不加锁,提高了并发性能。
  1. 锁机制
  • MySQL 使用锁来保证事务的隔离性。
  • 常见的锁有共享锁(S锁)和排他锁(X锁)。
  • 读操作可以加共享锁,写操作需要加排他锁。

三、代码实例讲解

1. 设置事务隔离级别
-- 设置事务隔离级别为读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 设置事务隔离级别为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 设置事务隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 设置事务隔离级别为串行化
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
2. 事务操作示例

假设我们有一个 accounts 表,结构如下:

CREATE TABLE accounts (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    balance DECIMAL(10, 2)
);

插入一些初始数据:

INSERT INTO accounts (id, name, balance) VALUES (1, 'Alice', 1000.00);
INSERT INTO accounts (id, name, balance) VALUES (2, 'Bob', 500.00);
3. 读未提交(Read Uncommitted)
-- 事务1:更新数据但未提交
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- 事务2:读取未提交的数据
START TRANSACTION;
SELECT * FROM accounts WHERE id = 1;  -- 可能读取到未提交的数据
COMMIT;

-- 事务1:回滚
ROLLBACK;
4. 读已提交(Read Committed)
-- 事务1:更新数据并提交
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

-- 事务2:读取已提交的数据
START TRANSACTION;
SELECT * FROM accounts WHERE id = 1;  -- 只能读取到已提交的数据
COMMIT;
5. 可重复读(Repeatable Read)
-- 事务1:更新数据并提交
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

-- 事务2:在同一事务中多次读取数据
START TRANSACTION;
SELECT * FROM accounts WHERE id = 1;  -- 第一次读取
-- 事务1提交后,事务2再次读取
SELECT * FROM accounts WHERE id = 1;  -- 结果与第一次读取一致
COMMIT;
6. 串行化(Serializable)
-- 事务1:更新数据
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- 事务2:尝试读取数据,但会被阻塞
START TRANSACTION;
SELECT * FROM accounts WHERE id = 1;  -- 事务1提交后才会执行
COMMIT;

-- 事务1:提交
COMMIT;

四、总结

  • 读未提交:最低隔离级别,可能导致脏读。
  • 读已提交:避免了脏读,但可能导致不可重复读。
  • 可重复读:避免了脏读和不可重复读,但可能导致幻读。
  • 串行化:最高的隔离级别,避免了所有并发问题,但性能最差。

MySQL 通过 MVCC 和锁机制来实现这些隔离级别,开发者可以根据业务需求选择合适的隔离级别。

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

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

相关文章

【计算机网络】考研复试高频知识点总结

文章目录 一、基础概念1、计算机⽹络的定义2、计算机⽹络的目标3、计算机⽹络的组成4、计算机⽹络的分类5、计算机⽹络的拓扑结构6、计算机⽹络的协议7、计算机⽹络的分层结构8、OSI 参考模型9、TCP/IP 参考模型10、五层协议体系结构 二、物理层1、物理层的功能2、传输媒体3、 …

【Python 数据结构 5.栈】

目录 一、栈的基本概念 1.栈的概念 2.入栈 入栈的步骤 3.出栈 出栈的步骤 4.获取栈顶元素 获取栈顶元素的步骤 二、 Python中的栈 顺序表实现 链表实现 三、栈的实战 1.LCR 123. 图书整理 I 思路与算法 2.LCR 027. 回文链表 思路与算法 3.1614. 括号的最大嵌套深度 思路与算法 …

C++基础算法:模拟

文章目录 1.[P1067 [NOIP 2009 普及组\] 多项式输出 - 洛谷](https://www.luogu.com.cn/problem/P1067)题目解析算法解析代码实现 2.[P5731 【深基5.习6】蛇形方阵 - 洛谷](https://www.luogu.com.cn/problem/P5731)题目解析算法原理代码实现 3.[P1098 [NOIP 2007 提高组\] 字符…

关于对机器中的人工智能进行基准测试

大家读完觉得有帮助记得及时关注和点赞!!! 抽象 最近的基准研究声称,AI 在各种认知任务上的表现已经接近甚至超过人类的“水平”。然而,本立场文件认为,当前的 AI 评估范式不足以评估类似人类的认知能力。我…

c++ 内存管理系统之智能指针

1.c内存管理 1.代码区 也称Text Segment,存放可执行程序的机器码。 2 数据区: 存放已初始化的全局和静态变量, 常量数据(如字符串常量)。 存放未初始化的全局和静态变量 无疑解释静态变量的来源: 局…

Unity中的Destroy和DestroyImmediate的区别是什么?

在 Unity 中,Destroy 和 DestroyImmediate 都是用于销毁游戏对象(GameObject)、组件(Component)或资源的方法。在大多数情况下,建议优先使用 Destroy 方法,只有在确实需要立即销毁对象时才使用 …

Microk8s Ingress实现七层负载均衡

Microk8s Ingress是什么 Ingress是k8s的一种资源对象,用于管理外部对集群内服务的访问, 它通过提供一个统一的入口点,将外部流量路由到集群内部的不同服务。 Microk8s Ingress用于解决什么问题 k8s集群中服务默认只能在集群内访问。 如果需要从外部访…

DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)

作者:后端小肥肠 目录 1. 前言 2. 解决方案 2.1. 纳米AI搜索(第三方平台) 2.2. Github(第三方平台) 2.3. 硅基流动(第三方API) 3. 本地部署详细步骤 3.1. 运行配置需求 3.2. 部署教程 4…

【大厂AI实践】美团:美团智能客服核心技术与实践

【大厂AI实践】美团:美团智能客服核心技术与实践 🌟 嗨,你好,我是 青松 ! 🌈 自小刺头深草里,而今渐觉出蓬蒿。 NLP Github 项目推荐: 【AI 藏经阁】:https://gitee.com…

科技查新有不通过的情况吗?为什么?

1. 科技查新有不通过的情况吗?为什么? 有。科技查新“不通过”(即查新报告显示技术缺乏新颖性或存在侵权风险)的情况并不罕见,主要原因包括: (1)技术缺乏创新性 重复开发&#xff…

批量提取 Word 文档中的页面

如何将 Word 文档中的页面提取出来形成一个新的文档呢?比如将 Word 文档中的第一页提取出来、将 Word 文档中的最后一页提取出来、再或者将 Word 文档中的中间几页提取出来等等。人工的处理肯定非常的麻烦,需要新建 Word 文档,然后将内容复制…

Spring统一格式返回

目录 一:统一结果返回 1:统一结果返回写法 2:String类型报错问题 解决方法 二:统一异常返回 统一异常返回写法 三:总结 同志们,今天咱来讲一讲统一格式返回啊,也是好久没有讲过统一格式返…

(十 八)趣学设计模式 之 观察者模式!

目录 一、 啥是观察者模式?二、 为什么要用观察者模式?三、 观察者模式的实现方式四、 观察者模式的优缺点五、 观察者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…

Linux虚拟机网络配置-桥接网络配置

简介 本文档旨在指导用户如何在虚拟环境中配置Linux系统的桥接网络,以实现虚拟机与物理主机以及外部网络的直接通信。桥接网络允许虚拟机如同一台独立的物理机一样直接连接到物理网络,从而可以被分配一个独立的IP地址,并能够与网络中的其他设…

视频教育网站开源系统的部署安装 (roncoo-education)服务器为ubuntu22.04.05

一、说明 前端技术体系:Vue3 Nuxt3 Vite5 Vue-Router Element-Plus Pinia Axios 后端技术体系:Spring Cloud Alibaba2021 MySQL8 Nacos Seata Mybatis Druid redis 后端系统:roncoo-education(核心框架:S…

线程相关八股

1. 线程和进程的区别? 进程:进程可以简单理解为进行一个程序,比如说我们打开一个浏览器,打开一个文本,这就是开启了一个进程,一个进程想要在计算机中运行,需要将程序交给CPU,将数据…

Python 绘制迷宫游戏,自带最优解路线

1、需要安装pygame 2、上下左右移动,空格实现物体所在位置到终点的路线,会有虚线绘制。 import pygame import random import math# 迷宫单元格类 class Cell:def __init__(self, x, y):self.x xself.y yself.walls {top: True, right: True, botto…

【音视频】VLC播放器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、vlc是什么? VLC Media Player(简称VLC)是一款免费、开源、跨平台的多媒体播放器,由非营利组织VideoLAN开发,最…

vue2+ele-ui实践

前言:真理先于实践,实践发现真理,再实践检验真理 环境:vue2 & element-ui 正片: Select 选择器 简称 下拉框 下拉框完整的使用循环 下拉框 → 点击下拉框 → 展示数据 → 选择数据 → 下拉框显示数据 核心具有…

刷题日记——部分二分算法题目分享

前言 咱们紧跟上一期结合时间复杂度浅谈二分法的好处, 并分享部分二分题目(将持续更新题目,绝对值你一个收藏)-CSDN博客 笔者接着分享一些刷过的关于二分算法的题目. 第一题 1283. 使结果不超过阈值的最小除数 - 力扣(LeetCode) 这道题就是典型的二…