MySQL InnoDB【事务模型】之【事务隔离级别】 全攻略

快速导航

    • 事务隔离级别
      • 可重复读(REPEATABLE READ)
      • 读提交内容(READ COMMITTED)
      • 读未提交内容(READ UNCOMMITTED)
      • 可串行化(SERIALIZABLE)

事务隔离级别

事务隔离是数据库处理的基础之一。隔离是缩写ACID中的I;当多个事务同时进行更改和查询时,隔离级别是微调性能与可靠性、一致性和结果再现性之间平衡的设置。

InnoDB提供SQL:1992标准描述的所有四种事务隔离级别: READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

InnoDB 的默认隔离级别是 REPEATABLE READ

用户可以使用 SET TRANSACTION 语句更改单个会话或所有后续连接的隔离级别。

要为所有连接设置服务器的默认隔离级别,可以在命令行或选项文件中使用 --transaction-isolation 选项。

InnoDB使用不同的锁定策略支持这里描述的每一种事务隔离级别。

  • 你可以使用默认的REPEATABLE READ级别来执行高度的一致性,用于对ACID合规性非常重要的关键数据的操作。

  • 在批量报告等情况下,精确的一致性和结果的可重复性没有最大限度减少锁定开销那么重要,这时可以使用 READ COMMITTED 或甚至 READ UNCOMMITTED 放宽一致性规则。

  • SERIALIZABLE 执行比 REPEATABLE READ 更严格的规则,主要用于特殊情况,如 XA 事务以及并发和死锁问题的故障诊断。

下面的列表描述了 MySQL 如何支持不同的事务级别。该列表从最常用的级别到最不常用的级别依次排列。

可重复读(REPEATABLE READ)

这是 InnoDB 的默认隔离级别。同一事务中的一致读取会读取第一次读取建立的快照。这意味着,如果在同一事务中发出多条普通(非锁定)SELECT 语句,这些 SELECT 语句之间也是一致的。

对于锁定读取(带有 FOR UPDATE 或 FOR SHARE 的 SELECT)、UPDATE 和 DELETE 语句,锁定取决于语句是使用带有唯一搜索条件的唯一索引,还是使用范围类型的搜索条件。

  • 对于具有唯一搜索条件的唯一索引,InnoDB 只锁定找到的索引记录,而不锁定之前的空白。
  • 对于其他搜索条件,InnoDB 会锁定所扫描的索引范围,使用间隙锁或下一键锁来阻止其他会话插入该范围所覆盖的间隙。

读提交内容(READ COMMITTED)

即使在同一个事务中,每次一致读取都会设置并读取自己的新快照。

对于锁定读取(带有 FOR UPDATE 或 FOR SHARE 的 SELECT)、UPDATE 语句和 DELETE 语句,InnoDB 只锁定索引记录,而不锁定它们之前的间隙,因此允许在锁定记录旁边自由插入新记录。间隙锁定仅用于外键约束检查和重复键检查。

由于间隙锁定被禁用,可能会出现幽灵行问题,因为其他会话可以在间隙中插入新记录。

READ COMMITTED 隔离级别仅支持基于行的二进制日志记录。如果使用带有 binlog\_format=MIXEDREAD COMMITTED,服务器会自动使用基于行的日志记录。

使用 READ COMMITTED 还会产生其他影响:

  • 对于 UPDATE 或 DELETE 语句,InnoDB 只为其更新或删除的记录加锁。非匹配记录的记录锁会在MySQL评估完WHERE条件后释放。这大大降低了死锁发生的概率,但死锁仍有可能发生。

  • 对于UPDATE语句,如果记录已经被锁定,InnoDB会执行 "半一致 "读取,向MySQL返回最新提交的版本,以便MySQL确定记录是否与UPDATE的WHERE条件相匹配。如果符合(必须更新),MySQL 会再次读取记录,这一次 InnoDB 要么锁定它,要么等待锁定。

    可以这样创建和填充表:

    CREATE TABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB;
    INSERT INTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2);
    COMMIT;
    

    在这种情况下,表中没有索引,因此搜索和索引扫描使用的是用于记录锁定的隐藏聚类索引,而不是索引列。

    假设一个会话使用这些语句执行 UPDATE:

    # Session A
    START TRANSACTION;
    UPDATE t SET b = 5 WHERE b = 3;
    

    还假设第二个会话在第一个会话的语句之后执行这些语句,从而执行 UPDATE:

    # Session B
    UPDATE t SET b = 4 WHERE b = 2;
    

    当 InnoDB 执行每次 UPDATE 时,它首先会获取每条记录的独占锁,然后决定是否修改它。如果InnoDB不修改记录,就会释放锁。否则,InnoDB 会保留锁,直到事务结束。这对事务处理的影响如下。

    在使用默认的 REPEATABLE READ 隔离级别时,第一个 UPDATE 会在读取的每一条记录上获取一个 x 锁,并且不会释放任何一个锁:

      x-lock(1,2); retain x-lockx-lock(2,3); update(2,3) to (2,5); retain x-lockx-lock(3,2); retain x-lockx-lock(4,3); update(4,3) to (4,5); retain x-lockx-lock(5,2); retain x-lock
    

    第二个 UPDATE 在尝试获取任何锁时就会阻塞(因为第一个更新保留了所有记录上的锁),直到第一个 UPDATE 提交或回滚后才会继续:

      x-lock(1,2); block and wait for first UPDATE to commit or roll back
    

    如果使用 READ COMMITTED 代替,则第一次 UPDATE 会为读取的每一条记录获取 x 锁,并为未修改的记录释放 x 锁:

      x-lock(1,2); unlock(1,2)x-lock(2,3); update(2,3) to (2,5); retain x-lockx-lock(3,2); unlock(3,2)x-lock(4,3); update(4,3) to (4,5); retain x-lockx-lock(5,2); unlock(5,2)
    

    对于第二次 UPDATE,InnoDB 会进行 "半一致 "读取,将读取到的每条记录的最新提交版本返回给 MySQL,以便 MySQL 确定该记录是否与 UPDATE 的 WHERE 条件相匹配:

      x-lock(1,2); update(1,2) to (1,4); retain x-lockx-lock(2,3); unlock(2,3)x-lock(3,2); update(3,2) to (3,4); retain x-lockx-lock(4,3); unlock(4,3)x-lock(5,2); update(5,2) to (5,4); retain x-lock
    

    但是,如果 WHERE 条件包含索引列,并且 InnoDB 使用了索引,那么在获取和保留记录锁时,只会考虑索引列。在下面的示例中,第一个 UPDATE 在 b = 2 的每条记录上获取并保留了一个 x 锁。第二个 UPDATE 在试图获取相同记录上的 x 锁时阻塞,因为它也使用了 b 列上定义的索引。

    CREATE TABLE t (a INT NOT NULL, b INT, c INT, INDEX (b)) ENGINE = InnoDB;
    INSERT INTO t VALUES (1,2,3),(2,2,4);
    COMMIT;# Session A
    START TRANSACTION;
    UPDATE t SET b = 3 WHERE b = 2 AND c = 3;# Session B
    UPDATE t SET b = 4 WHERE b = 2 AND c = 4;
    

    READ COMMITTED 隔离级别可在启动时设置,也可在运行时更改。在运行时,可以对所有会话进行全局设置,也可以对每个会话进行单独设置。

读未提交内容(READ UNCOMMITTED)

SELECT 语句是以非锁定方式执行的,但可能会使用记录的早期版本。

因此,使用这种隔离级别,这种读取是不一致的。这也被称为 “脏读”。否则,该隔离级别的工作方式与 READ COMMITTED 类似。

可串行化(SERIALIZABLE)

该级别与 REPEATABLE READ 类似,但如果禁用了自动提交,InnoDB 会将所有普通 SELECT 语句隐式转换为 SELECT ... FOR SHARE。如果启用了自动提交,SELECT 就是它自己的事务。

因此,SELECT 被认为是只读的,如果以一致(无锁)读取的方式执行,则可以序列化,无需阻塞其他事务。(要在其他事务修改了所选行的情况下强制阻塞普通 SELECT,请禁用自动提交)。

从 MySQL 授予表(通过连接列表或子查询)读取数据但不修改数据的 DML 操作不会获取 MySQL 授予表上的读锁,无论隔离级别如何。

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

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

相关文章

「邀您参会」首个中国可观测日即将盛大开幕

在云计算领域不断探索与创新的背景下,亚马逊云科技与观测云今日宣布,将联合举办中国可观测日(Observability Day)活动,旨在深化双方合作,共同推动中国可观测性的发展。 中国站首站,选址上海&am…

软件测试——非功能测试

工作职责: 1.负责产品系统测试,包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写,包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求: 1.熟练…

使用html2canvas实现图片或者dom元素的样式展示

html或者.vue.tsx模板 <div class"tan1" id"tan1"><div class"jiang" id"jiangImg1" style"margin: 1rem auto 0;width: 75%;height: 10rem;position: relative;background-color: transparent;"><img id&q…

Laravel数据库的魔法棒:深入探索数据库迁移(Migrations)

Laravel数据库的魔法棒&#xff1a;深入探索数据库迁移&#xff08;Migrations&#xff09; 在Laravel的世界中&#xff0c;数据库迁移&#xff08;Migrations&#xff09;是一种强大的工具&#xff0c;它允许开发者以版本控制的方式管理数据库结构的变化。通过迁移&#xff0…

中级java每日一道面试题-2024年7月17日

面试官: 操作字符串都有哪些类?它们之间有什么区别? 我回答: String 描述&#xff1a;String是最基本的字符串类&#xff0c;用于表示不可变的字符序列。一旦创建了一个String对象&#xff0c;其内容就不能被改变。特性&#xff1a; 不可变性&#xff08;Immutability&#…

【启明智显方案分享】工业级HMI芯片MODEL3\MODEL4应用于电梯系统多媒体

一、方案概述 本方案采用工业级HMI芯片MODEL3或MODEL4作为核心处理器&#xff0c;结合7寸以上高清显示屏&#xff0c;为电梯系统提供多媒体解决方案。该方案不仅能够显示日期、时间、楼层信息等基础信息&#xff0c;还能播放广告、通知、视频等多媒体内容&#xff0c;增强电梯…

HTTPS请求头缺少HttpOnly和Secure属性解决方案

问题描述&#xff1a; 建立Filter拦截器类 package com.ruoyi.framework.security.filter;import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.…

友讯随身WiFi和格行随身WiFi真实测评!彩屏款随身WiFi谁更胜一筹?随身WiFi哪个最好用?随身WiFi哪个口碑最好?哪个性价比更高?

在众多随身WiFi品牌中&#xff0c;友讯&#xff08;D-Link&#xff09;与格行&#xff08;Gexing&#xff09;都是彩屏款随身WiFi因其相似的设计和各自独特的品牌背景&#xff0c;常常让消费者难以抉择。今天&#xff0c;我们就来一场真实测评&#xff0c;深入剖析这两款彩屏随…

求解答word图标变白

把WPS卸载了之后就变成白色了&#xff0c;然后在注册表中把word的地址改成office word的地址之后图标变成这样了&#xff0c;怎么办

Talk|清华大学袁天远:PreSight - 利用NeRF先验帮助自动驾驶场景在线感知

本期为TechBeat人工智能社区第605期线上Talk。 北京时间7月3日(周三)20:00&#xff0c;清华大学博士生—袁天远的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “PreSight - 利用NeRF先验帮助自动驾驶场景在线感知”&#xff0c;他向大家介绍了新…

【XSS】

文章目录 0x01 简介0x02 XSS Payload用法XSS攻击平台及调试JavaScript 0x03 XSS构造技巧XSS漏洞防御策略 跨站脚本攻击&#xff0c;Cross Site Script。&#xff08;重点在于脚本script&#xff09; 分类 反射型、存储型DOM型 漏洞原理&#xff1a;通过插入script篡改“HTML”…

Kotlin Flow:掌握基本,征服应用,避开开发陷阱!

文章目录 1. 前言2. Kotlin Flow基本概念2.1 什么是数据流&#xff1f;2.2 Kotlin Flow是什么&#xff1f;2.3 有了LiveData和协程&#xff0c;为啥还需要Kotlin Flow&#xff1f;2.4 相比RxJava&#xff0c;Kotlin Flow有什么优势? 3. 基本使用3.1 Flow的创建和消费3.2 操作符…

AI 生成时代,现有编程语言还够用吗?

7月14日下午&#xff0c;知乎「AI 先行者沙龙」在深圳南山举行&#xff0c;本次沙龙以 “探航” 为主题&#xff0c;粤港澳大湾区数字经济研究院基础软件中心首席科学家、MoonBit 平台负责人张宏波受邀发表主旨演讲——《AI 生成时代&#xff0c;现有编程语言还够用吗&#xff…

PyTorch论文

2019-12 PyTorch: An Imperative Style, High-Performance Deep Learning Library 设计迎合4大趋势&#xff1a; 1. array-based (Tensor) 2. GPU加速 3. 自动求导 (Auto Differentiation) 4. 拥抱Python生态 4大设计原则&#xff1a; 1. 使用算法和数据开发者熟悉的Python做编…

华为USG6000V防火墙NAT智能选举

目录 一、拓扑图 二、要求 三、配置思路及方法 要求1&#xff1a;通过多对多的NAT实现上网功能 思路&#xff1a;基础IP地址配置按照之前的进行配置&#xff0c;接着在策略里配置多对多的NAT 要求2&#xff1a;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的…

stm32入门-----GPIO口输入的学习与使用

目录 前言 一、硬件介绍 1.按键 2.传感器模块 二、按键控制LED灯亮灭 1.电路连线图 2. 工程文件添加 3.GPIO口读取函数介绍 &#xff08;1&#xff09;输入数据的读取 &#xff08;2&#xff09;输出数据的读取 4.代码编写 &#xff08;1&#xff09;按键模块 …

简述MVVM?

什么是MVVM&#xff1f; MVVM: Model-View-ViewModel 视图模型双向绑定 Model: 数据模型 View: UI组件 ViewModel: 是View和Model层的桥梁&#xff0c;数据会绑定到viewModel层并自动将数据渲染到页面中&#xff0c;视图变化的时候会通知viewModel层更新数据。 以前是操作…

SQLite DISTINCT 关键字

SQLite DISTINCT 关键字 SQLite 是一种轻量级的数据库管理系统&#xff0c;广泛用于各种应用程序中。它提供了一个强大的查询语言&#xff0c;包括 DISTINCT 关键字&#xff0c;用于去除查询结果中的重复行&#xff0c;只返回唯一的记录。 1. DISTINCT 关键字的基本用法 DIS…

Linux容器篇-kubernetes监控和日志管理

文章目录 一、kubernetes基本概念二、集群资源监控查看API资源对象及缩写查看master组件状态查看集群节点状态查看资源详情查看资源信息资源监控服务 k8s日志kubelet日志&#xff1a;pod组件日志&#xff1a;系统日志&#xff1a;容器的标准输出日志&#xff1a; 一、kubernete…

智能制造 v3.13.16 发布,ERP、MES 更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…