事务的隔离级别和MDL

文章目录

  • 说明
  • 不同隔离级别可能发生的现象
  • 关键现象解释
  • MDL(元数据锁,Metadata Lock)
    • MDL 的作用
    • MDL 的工作原理
    • MDL 锁的常见场景
    • 如何避免 MDL 阻塞

说明

  • 本文章由大模型对话整理而来,如果有错误之处,请在评论区留言指正!

不同隔离级别可能发生的现象

隔离级别脏读不可重复读幻读描述
读未提交可能可能可能最低的隔离级别,事务可能读取未提交的数据。
读已提交不可能可能可能保证读取的数据已经提交,但不保证重复读取一致。
可重复读不可能不可能可能保证同一事务内多次读取一致,但可能出现幻读。
串行化不可能不可能不可能最高的隔离级别,完全隔离,事务按顺序执行。

关键现象解释

  1. 脏读:一个事务可以读取另一个事务未提交的数据。
  2. 不可重复读:一个事务在读取某行数据时,另一个事务修改了这行数据,导致前后读取结果不一致。
  3. 幻读:一个事务读取了一批数据后,另一个事务插入了新的数据,导致前后读取的结果集不一致。

MDL(元数据锁,Metadata Lock)

  • MDLMySQL 的一种锁机制,全称为 Metadata Lock(元数据锁)。它用于管理数据库表的元数据(Metadata),在 MySQL 5.5 中引入,目的是确保在并发环境下,表的结构和数据操作之间的一致性与安全性。

MDL 的作用

MDL 锁的主要作用是 在对表结构和数据进行操作时,保护元数据的完整性,防止冲突.

  1. 防止并发操作冲突:

    • 当一个事务正在对表执行 CRUD 操作(加 MDL 读锁)时,其他线程不能对表的结构进行变更(如 ALTER TABLE)。
    • 当表的结构在变更中(加 MDL 写锁)时,其他线程不能执行任何对表的操作(包括 CRUD 和结构变更)。
  2. 保持一致性:

    • MDL 锁确保在事务没有完成时,表的结构不会被修改,从而避免数据和元数据的不一致。
  3. 自动管理:

    • MDL 锁是 MySQL 自动管理的锁,用户无需手动干预,但需要注意其可能带来的阻塞。

MDL 的工作原理

  1. MDL 的加锁机制

    • 在对表执行操作(包括查询、插入、更新、删除等)时,MySQL 会自动为表加上 MDL 锁
      • CRUD 操作(查询、插入、更新、删除):会加 MDL 读锁
      • DDL 操作(如 ALTER TABLEDROP TABLE:会加 MDL 写锁
  2. 锁的类型

    • MDL 读锁
      • 多个事务可以同时持有同一个表的读锁(允许并发读写操作)。
      • 如果有线程想对表进行结构变更(DDL 操作),必须等待所有读锁释放。
    • MDL 写锁
      • 写锁是独占锁,只有当前线程持有写锁时,才能对表结构进行变更。
      • 写锁会阻塞其他线程对该表的 CRUD 操作和结构变更操作。
  3. MDL 的持有时间

    • MDL 锁会从事务开始时获取,并在事务提交或回滚时释放。
    • 未提交的事务会长期持有 MDL 锁,可能导致阻塞问题。

MDL 锁的常见场景

  1. CRUD 操作时加 MDL 读锁
  • 事务在对表进行数据操作时,会自动加 MDL 读锁
    BEGIN;
    SELECT * FROM users WHERE id = 1; -- 加 MDL 读锁
    -- 提交或回滚之前,其他线程无法对表结构做变更操作
    COMMIT;
    
  1. DDL 操作时加 MDL 写锁
  • 对表执行 DDL(如 ALTER TABLE)时会加 MDL 写锁
    ALTER TABLE users ADD COLUMN age INT; -- 加 MDL 写锁
    -- 阻塞其他线程的 CRUD 操作,直到操作完成
    
  1. 阻塞问题
  • 场景:当事务未提交时,会长期持有 MDL 锁,导致后续操作阻塞。例如:
    1. 事务 A 持有 MDL 读锁,未提交:
      BEGIN;
      UPDATE users SET name = 'Alice' WHERE id = 1; -- 持有 MDL 读锁
      
    2. 事务 B 想对表结构进行修改,无法获取 MDL 写锁:
      ALTER TABLE users ADD COLUMN age INT; -- 阻塞
      
    3. 等待事务 A 提交或回滚后,事务 B 才能继续。

如何避免 MDL 阻塞

  1. 快速提交事务:避免长时间未提交的事务,因为未提交的事务会持有 MDL 锁。
  2. 分离读写与结构变更操作:在表上的 DDL 操作应该安排在业务低峰期,以减少对正常 CRUD 操作的影响。
  3. 使用 NOWAITSKIP LOCKED:在 MySQL 8.0 之后,可以通过设置 NOWAITSKIP LOCKED 来避免阻塞。例如:
ALTER TABLE users ADD COLUMN age INT NOWAIT;
  1. 查询阻塞锁信息:在遇到阻塞时,可以查询 performance_schema.metadata_locks 表来排查问题:
SELECT * FROM performance_schema.metadata_locks;
  1. 分步执行 DDL 操作:如果表较大或有大量并发操作,可以通过 ONLINE DDL 或分步操作减少锁的影响:
ALTER TABLE users ADD COLUMN age INT, ALGORITHM=INPLACE, LOCK=NONE;

  • MDL(Metadata Lock) 是 MySQL 为了保护表的元数据完整性而设计的锁机制。它分为 读锁写锁,会在表执行 CRUD 或 DDL 操作时自动加锁。
  • MDL 锁确保了事务在操作数据期间,表结构不会被修改,同时也可能引发阻塞问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装,用户管理,进程管理,shell 命令,硬链接和软连接,解压和压缩,功能性语句,结构性语句,分文件,make工具,shell脚本 0.2、C高级 …

ISP流程--去马赛克详解

前言 本期我们将深入讨论ISP流程中的去马赛克处理。我们熟知,彩色图像由一个个像元组成,每个像元又由红、绿、蓝(RGB)三通道构成。而相机传感器只能感知光的强度,无法直接感知光谱信息,即只有亮暗而没有颜色…

阿里云-通义灵码:在 PyCharm 中的强大助力(下)

目录 六.通义灵码在 PyCharm 中的优势与不足 1.优势 (1).提高开发效率 (2).提升代码质量 (3).易于使用 (4).不断学习和改进 2.不足 (1).依赖网络 (2).准确性有待提高 (3).局限性 七.未来发展展望 1.提高准确性和可靠性 2.与其他工具的集成 3.智能化程度的提升 八…

开源项目stable-diffusion-webui部署及生成照片

参考链接 https://www.freedidi.com/13133.html 基础环境部署 python 官网链接 Python Release Python 3.10.6 | Python.org 下载 Python 3.10.6 版本安装包 下载好后双击 点击安装,这里需要选择一下,把环境变量加上。(这里是默认安装到C盘…

【芯片封测学习专栏 -- 单 Die 与 多Die(Chiplet)介绍】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 Overview单个Die(Monolithic Die)多个Die(Chiplet Architecture or Heterogeneous SoC)如何判断一个SoC是…

Windows 安装 Docker 和 Docker Compose

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

java_将数据存入elasticsearch进行高效搜索

使用技术简介: (1) 使用Nginx实现反向代理,使前端可以调用多个微服务 (2) 使用nacos将多个服务管理关联起来 (3) 将数据存入elasticsearch进行高效搜索 (4) 使用消息队列rabbitmq进行消息的传递 (5) 使用 openfeign 进行多个服务之间的api调用 参…

Github Copilot学习笔记

(一)Prompt Engineering 利用AI工具生成prompt设计好的prompt结构使用MarkDown语法,按Role, Skills, Constrains, Background, Requirements和Demo这几个维度描述需求。然后收输入提示词:作为 [Role], 拥有 [Skills], 严格遵守 […

android分区和root

线刷包内容: 线刷包是一个完整的android镜像,不但包括android、linux和用户数据,还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区,包括linux下主要的二进制程序。 boot.img…

RabbitMQ基础(简单易懂)

RabbitMQ高级篇请看: RabbitMQ高级篇-CSDN博客 目录 什么是RabbitMQ? MQ 的核心概念 1. RabbitMQ 的核心组件 2. Exchange 的类型 3. 数据流向说明 如何安装RabbitQueue? WorkQueue(工作队列): Fa…

大数据环境搭建进度

1.使用虚拟机的系统:centos7.xLinux 2.资源不足,使用云服务器: 1. 3.使用远程登录进行操作 用xshell 4.任务 1.虚拟机装好 2.设置IP地址 3.可以联网 4.设置远程登录访问 5.创建module和software目录,修改两…

Mysql--运维篇--主从复制和集群(主从复制I/O线程,SQL线程,二进制日志,中继日志,集群NDB)

一、主从复制 MySQL的主从复制(Master-Slave Replication)是一种数据冗余和高可用性的解决方案,它通过将一个或多个从服务器(Slave)与主服务器(Master)同步来实现。主从复制的基本原理是&#…

【EI会议征稿通知】第十一届机械工程、材料和自动化技术国际会议(MMEAT 2025)

本次大会旨在汇聚全球机械工程、材料科学及自动化技术的创新学者和行业专家,为他们提供一个卓越的交流与合作平台。随着全球对可持续技术和智能制造需求的不断增加,MMEAT 2025将重点关注这些领域的最新发展趋势和未来前景。此次大会的主要目标是推动机械…

OpenCV基础:视频的采集、读取与录制

从摄像头采集视频 相关接口 - VideoCapture VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自多种源的视频。 主要参数: cv2.VideoCapture(source): source: 这是一个整数或字符串,表示视频的来源。 如果是整数&a…

解读Linux Bridge中的东西流向与南北流向

解读Linux Bridge中的东西流向与南北流向 在现代云计算和虚拟化环境中,网络流量的管理和优化变得越来越重要。Linux Bridge作为Linux内核提供的一个强大的二层交换机工具,在虚拟化和容器化应用中扮演着至关重要的角色。本文将深入探讨Linux Bridge中的两…

车联网安全--TLS握手过程详解

目录 1. TLS协议概述 2. 为什么要握手 2.1 Hello 2.2 协商 2.3 同意 3.总共握了几次手? 1. TLS协议概述 车内各ECU间基于CAN的安全通讯--SecOC,想必现目前多数通信工程师们都已经搞的差不多了(不要再问FvM了);…

RuoYi Cloud项目解读【四、项目配置与启动】

四、项目配置与启动 当上面环境全部准备好之后,接下来就是项目配置。需要将项目相关配置修改成当前相关环境。 1 后端配置 1.1 数据库 创建数据库ry-cloud并导入数据脚本ry_2024xxxx.sql(必须),quartz.sql(可选&…

第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目

Q1、跳过交替单元格的之字形遍历 1、题目描述 给你一个 m x n 的二维数组 grid,数组由 正整数 组成。 你的任务是以 之字形 遍历 grid,同时跳过每个 交替 的单元格。 之字形遍历的定义如下: 从左上角的单元格 (0, 0) 开始。在当前行中向…

Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能

Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能 基于SpringBoot3Vue3前后端分离的Java快速开发框架 项目简介:基于 JDK 17、Spring Boot 3、Spring Security 6、JWT、Redis、Mybatis-P…

R数据分析:多分类问题预测模型的ROC做法及解释

有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲ROC在多…