Mysql事务隔离级别是怎么实现的?

news2024/12/27 14:19:59

文章目录

    • 事务隔离级别
      • 解析
    • 常用命令
      • 查看事务隔离级别设置
      • 修改隔离级别
      • 隔离级别演示
      • Mysql事务操作
    • MVCC实现原理
      • undo log版本链
      • ReadView
    • 练习一下
      • 案例1
      • 案例2
    • 问答环节
      • 1、Mysql 可重复读到底有没有解决幻读?

事务隔离级别

Mysql的事务隔离级别是由Mysql的各种锁以及MVCC机制来实现的。
不同隔离级别存在的问题:
在这里插入图片描述

在Mysql Innodb存储引擎下,RC、RR是基于MVCC(多版本并发控制)进行并发事务控制的。
先来看一个问题,先想一下在不同隔离级别下,事务D读取到的内容是什么?

解析

Undo Log版本链
在这里插入图片描述

RC隔离级别时的ReadView:
在这里插入图片描述

常用命令

查看事务隔离级别设置

# 查看事务隔离级别 5.7.20 之后
show variables like 'transaction_isolation';
SELECT @@transaction_isolation

# 5.7.20 之后
SELECT @@tx_isolation
show variables like 'tx_isolation'

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+

修改隔离级别

完整设置语句

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

案例:设置全局隔离级别为读提交级别。

mysql> set global transaction isolation level read committed;

隔离级别演示

set tx_isolation='read-committed';
BEGAIN;
UPDATE t_user set name = '子涵先生';COMMIT;

Mysql事务操作

Mysql事务开启有两种方式:

  • begin/start transaction:begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作InnoDB表的语句,事务才真正启动。
  • start transaction with consistent snapshot:这个命令可以立即启动一个事务。

InnoDB里面每个事务有一个唯一的事务ID,叫作transaction id。它是在事务开始的时候向InnoDB的事务系统申请的,是按申请顺序严格递增的。

MVCC实现原理

MVCC的实现原理是基于:undolog版本链+Readview。

undo log版本链

  • trx_id:事务版本号,自增;
  • DB_ROLL_PTR(回滚指针):指向上一个版本的数据。
    在这里插入图片描述

UBDO_LOG版本链不是立即删除的,Mysql在确保版本链数据不再被“引用”后才会进行删除。

ReadView

ReadView的作用:从版本链中读取数据,数据读取的时候为“快照读”。

补充一下:

  1. 快照读:普通的select查询语句;
  2. 当前读:Insert、Update、Delete、Select … for update、Select …lock in share mode。

ReadView的结构:

  • m_ids:表示在生成readview时,当前系统中活跃的读写事务id列表;
  • min_trx_id:表示在生成readview时,当前系统中活跃的读写事务中最小的事务id,也就是m_ids中最小的值;
  • max_trx_id:表示生成readview时,系统中应该分配给下一个事务的id值;
  • creator_trx_id:表示生成该readview的事务的事务id。

MVCC中的数据读取规则

  1. 优先读取当前事务版本中的数据;
  2. 否则根据版本链找到非活跃事务中的数据。

READ COMMITTEDREPEATABLE READ均是基于MVCC实现的,其区别就在于ReadView中的的生成时机:

  • READ COMMITTED生成时机是在每次查询时;
  • REPEATABLE READ是在当前事务开启时创建的。

练习一下

案例1

事务A:

select * from user where user_name ='张三';  -- 张三user_age为50
-- 此时事务B执行一下
select * from user where user_name ='张三';  -- question1:在两种不同的事务隔离级别下,张三user_age为结果为多少?

事务B:

insert into user (user_name,user_age) values ('张三',25);

案例2

事务A:

select * from user where user_name ='张三';  -- 张三user_age为50
-- 此时事务B执行一下
select * from user where user_name ='张三';  -- question1:张三user_age为结果为多少?
update set user_age = 100 where user_name ='张三'; 
select * from user where user_name ='张三';  -- question2:张三user_age为结果为多少?

事务B:

insert into user (user_name,user_age) values ('张三',25);

问答环节

1、Mysql 可重复读到底有没有解决幻读?

幻读的官网解释:The so-calledphantomproblem occurs within a transaction when the same query produces different sets of rows at different times. For example, if aSELECTis executed twice, but returns a row the second time that was not returned the first time, the row is a“phantom”row.

能,但不完全能,遇到当前读的时候,ReadView会被重新创建,可以读取到其他事务提交后被新增的数据。

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

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

相关文章

基于工业网关的储罐在线监测系统解决方案

储罐可以用来存放油、气、化学原料、工业原料等物资,是石油、化工、粮油、国防、冶金等行业必不可少的基础设施。随着储罐行业和相关行业的发展,越来越多企业开始运用储罐并产生储罐在线监测需求,需要实时了解储罐内的状态,保证重…

最强ADI SHARC系列DSP:ADSP-SC589的开发入门详解

作者的话 ADI的SHARC系列DSP,现阶段最强的型号是SC589,那么我就以SC589为例,写一点资料,让新手能够比较便捷的熟悉开发环境,软硬件,顺利的进入开发。 文档解决的是入门的问题,所以不会深入去写…

SpringCloud Alibaba框架都有啥啊

前言 文章目录前言1.集成Nacos实现服务的自动注册与发现2. Feign负载均衡注:OpenFeign和Feign的区别:3.使用Sentinel实现了接口的限流4.Feign整合Sentinel实现容错5.API网关6.Sleuth整合ZipKin实现链路追踪7.消息队列MQspring cloud是一个基于springboot…

做软件测试如何突破月薪20K?

IT行业从事技术岗位,尤其对于测试来说,月薪20K,即便在北上广深这类一线城市薪水也不算低了,可以说对于大部分测试岗位从业者来说,20K都是一个坎儿。 那么,问题来了,做软件测试如何可以达到月薪…

贪心,动态规划的区别

题目(力扣53): 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。 示例: 输入:n…

System V 消息队列(一)—— 消息队列相关接口函数(msgget / msgctl)

SystemV方案是在OS内核层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口。SystemV方案包含三种:共享内存、消息队列、信号量。 和System V 共享内存一样,OS为了管理这些消息队列…

【机器学习实战】对加州住房价格数据集进行数据探索(读书笔记)

1. 数据集描述及获取 数据集下载地址:housing.csv数据集的结构: 其中数据集有10个属性,分别为经度、纬度、housing_median_age、房间总数、卧室总数、人口数、家庭数、收入中位数、房价中位数、ocean_proximity。 2. 对数据集进行探索 2.…

web系统开发中关于企业里各种系统分类

关于企业里各种系统 OA 办公自动化系统 Office Automation (将现代化办公和计算机网络功能结合起来的新型办公方式) 功能:工作流、知识管理 功能模块:日报、考勤、事项审批等CRM 客户关系管理 Customer Relationship Management&…

C++日期和时间编程小结

C11 的日期和时间编程内容在 C Primer(第五版)这本书并没有介绍,目前网上的文章又大多质量堪忧或者不成系统,故写下这篇文章用作自己的技术沉淀和技术分享,大部分内容来自网上资料,文末也给出了参考链接。 日期和时间库是每个编程…

百度前端二面常考面试题

HTTP分层 第一层:物理层,TCP/IP 里无对应;第二层:数据链路层,对应 TCP/IP 的链接层;第三层:网络层,对应 TCP/IP 的网际层;第四层:传输层,对应 TCP…

编写递归函数,求斐波那契数列第n项

要求&#xff1a;编写递归函数int f(int n)&#xff0c;计算如下公式&#xff1a; 定义main函数输入n&#xff0c;调用f函数进行计算&#xff0c;在main函数中输出计算结果。 【样例输入】 10 【样例输出】 89 主函数&#xff1a; #include<stdio.h> int main() { in…

基于ssm的社区疫情返乡管控系统设计实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

C# 学习之路(类型、存储和变量)

C# 学习之路&#xff08;类型、存储和变量&#xff09; C# 是一组类型声明 如果泛泛的描述 C 和 C 程序源代码的特征&#xff0c;可以说 C 程序是一组函数和数据类型&#xff0c;C 是一组函数和类&#xff0c;而 C# 程序是一组类型的声明。 命名空间是一种将相关的类型声明分组…

mongodb 5.0.14 副本集 安装 单机版 记录

1、下载tgz 连接地址&#xff1a;mongodb 5.0.14下载 2、创建用户 useradd mongouserpasswd mongouser 3、解压tgz wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.14.tgz tar -zxvf mongodb-linux-x86_64-rhel70-5.0.14.tgz 4、拆分3个独立的mo…

编程团体赛

目录 1047:编程团体赛 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路: 代码: 时间复杂度: 总结: 题目链接: 1047:编程团体赛 编程团体赛的规则为&#xff1a;每个参赛队由若干队员组成&#xff1b;所有队员独立比赛&a…

Protocol buffe vs Json 为什么还会大量使用Json?

JSON&#xff1a;的最大优点就是可读性好&#xff0c;但是体积大。 Protocol Buffers&#xff1a;最大的特点就是体积小&#xff0c;传输需要带宽小&#xff0c;速度快。但是可读性较差 尽管JSON和Protobuf消息可以互换使用&#xff0c;但这些技术的设计目标不同。JSON代表Ja…

【元胞自动机】格子波尔兹曼模型及其应用研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

我去!Python 不愧是脚本之王,这 23 种命令行用法你全部 get 了吗?

1. 快速打印函数的调用栈 在阅读源码的时候&#xff0c;有时候我们想要看整个程序的调用栈是怎样的&#xff1f; 比较常规的做法是使用全局搜索函数&#xff0c;一层一层往上走&#xff0c;效率非常之低。 而我习惯了使用 pdb 对代码进行调试&#xff0c;在使用pdb时&#x…

vscode环境中配置git

1. 建立project空目录用于存放electron基本环境这个环境中得文件不能加入git项目中否则每次更新文件太大github不支持大于100M得文件上传 2. 使用vscode打开project目录 3.打开终端运行npm install electron 运行完成后会生成electron相关得两个json文件和一个文件夹 4.新建一个…

读取图片输出字符图案:用字符输出足球的图案

用字符输出足球的图案前言功能描述实现思路代码实现1️⃣ 获取像素点的RGB数值2️⃣ 判断每个像素点的RGB值是否符合3️⃣ main方法结果测试前言 世界杯&#xff0c;如火如荼的进行着&#xff0c;作为程序员也参加一下活动&#xff0c;蹭一下世界杯的热度 功能描述 通过读取足球…