MySQL事务的隔离级别

前置阅读

快速搭建 Linux 学习平台

一、事务的特性

对于事务,我觉得有一句英文描述的非常贴切:All or not, now or never.
事务 (Transaction)可以说是关系型数据库最重要的特性了。SQL 事务就是一个或者多个 SQL 语句的集合,这些 SQL 语句组成了一个单个的逻辑单元,所以它只有两种执行结果:commit 或者 rollback。学过操作系统的同学都会了解到,当程序引入多进程或者多线程时,也随之而来的并发问题。同样事务也是为了保证在并发执行的情况下数据的完整性。

事务开启语句是由 begin 或者 start transaction 命令开始的,或者把自提交特性关闭(set autocommit = 0)。事务结束语句通常使用 commit 或者 rollback。commit 表示提交事务,事务对数据库的修改成为永久性的,rollback 表示回滚事务,撤销正在进行中的所有未提交的修改。

事务的特性即:ACID。

  • Atomicity 原子性

  • Consistency 一致性

  • Isolation 隔离性

    Isolation is the database-level property that controls how and when changes are made, and if they become visible to each other, users, and systems.

    隔离性是控制修改如何(How)和 何时(When)发生,以及它们是否对于其它事务、用户和系统是可见的的数据库级别属性。

  • Durability 持久性

这里只重点介绍 Isolation (隔离性)是希望突出重点,关于其它三点性质,读者可以自行查阅理解。

注:acid 在英文有酸性的意思。同样,另一个分布式事务,它的特性是 base,它有碱性的意思。

二、事务的隔离性

MySQL InnoDB 存储引擎实现了 SQL 标准的 4 种隔离级别,用来限定事务内外的哪些改变是可见的,哪些是不可见的。

MySQL是各个隔离级别分别是:

  • Read Uncommitted 读未提交,简称 RU

    在一个事务中,它可以读取到其他事务还未提交的数据变化,这种现象称为脏读。

  • Read Committed 读已提交,简称 RC

    在一个事务中,可以读取到其他事务已经提交的数据变化,这种现象称为不可重复读。

  • Repeatable Read 可重复读,简称 RR

    它是 MySQL 默认的事务隔离级别。在一个事务中,从它开始直到事务结束,都可以反复读取到事务刚开始看到的数据,并一直不会发生变化,避免了脏读、不可重复读和幻读现象。

  • Serialization 可串行化

    不建议在生产环境使用,在某些特殊情况下会使用到。

这四个隔离级别的隔离性是逐渐增大的,隔离性越大,系统的开销越大。默认的隔离级别是 RR,如果实际的应用不需要这个隔离级别,可以降低隔离级别,这样会提高性能。但是除非你对数据库的隔离级别很了解,否则最好只使用默认的隔离级别。

三、隔离性实践

下面会涉及到实际的操作,它依赖的环境是前置条件中的那篇快速搭建环境的博客中所搭建的(MySQL 8.0)。

MySQL 默认的隔离级别是:REPEATABLE-READ,可重复读,简称 RR。

  • 查看默认的隔离级别:show variables like '%isolation'; 或者 select @@transaction_isolation;
  • 修改默认的隔离级别:SET transaction_isolation = 'READ-UNCOMMITTED';

注:这里要特别注意,在命令行中输入不要漏掉了末尾的 ;
注:这里修改的是当前 session 的隔离级别,不是全局的隔离级别,所以需要在每个终端执行。

在这里插入图片描述
在这里插入图片描述

创建数据库和测试表

创建并使用数据库:CREATE database crazy_dragon;

切换到数据库:USE crazy_dragon;

创建测试表:

CREATE table t_user_account(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL,balance INT NOT NULL,PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这个表是一个简化的用户账户表(id,name,balance)。
注意:balance 余额。

在这里插入图片描述

插入一条测试数据:

在这里插入图片描述

读未提交 RU

SET transaction_isolation = 'READ-UNCOMMITTED';

在读未提交(RU)的隔离级别下,会出现脏读的现象。这里假设有两个事务,简称事务 A 和 事务 B。在事务 A 在执行的过程中,它是可以感知到事务 B 的 DML 操作的,这样来说其实读未提交就相当于是没有隔离级别了。

事务 A 把 id = 1 的用户 tom 的余额更新为 1200,接着事务 B 进行查询,此时它查出的结果为 1200,然后事务 A 回滚。此时数据库中的余额仍为 1000,但是事务B读取到了1200,这就是脏读。

在这里插入图片描述

读已提交 RC

SET transaction_isolation = 'READ-COMMITTED';

在 RC 隔离级别下,可以避免脏读。同样,事务 A 和事务 B,现在的隔离级别是读已提交。所以,只有已经提交的数据,才可以被另一个事务感知到,这样就不会发生脏读了。

在这里插入图片描述

读已提交避免了脏读现象,但是还有不可重复读和幻读问题。不可重复读,指的是在一个事务范围内,多次查询结果字段值不同。幻读,值的是在一个事务范围内,多次查询结果行数不同。所以,这里要注意区分这两个的区别:不可重复读,强调是是字段值;幻读,强调的是数据结果的行数。

下面来分别演示不可重复读和幻读的情况。

在这里插入图片描述

第二个事务前后两次查询的的 balance 字段结果不同,这就是不可重复读(update)。多次读取的结果无法确定(无法确定另一个事务的改动)。

在这里插入图片描述
第二个事务两次查询的结果行数不一致,这就是幻读(insert)。

幻读和不可重复读很相似,但是幻读强调的是查询结果集合的增减,而不是单条数据的更新。

可重复读 RR

默认的隔离级别:Repeatable Read,简称 RR。可以解决不可重复读和幻读。

set transaction_isolation = 'REPEATABLE-READ'

下面分别演示了,在 RR 隔离级别下,不可重复读和幻读问题被解决。

在这里插入图片描述

在这里插入图片描述

参考博客

Understanding the Isolation Property in a Database (lifewire.com)

MySQL :: MySQL 8.0 Reference Manual :: 15.7.2.1 Transaction Isolation Levels

A primer on sql transactions

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

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

相关文章

AIGC人工智能涉及三十六职业,看看有没有你的职业(一)

文章目录 一只弹吉他的熊猫 神奇的企鹅 功夫熊猫 视觉光影下的女子 闪光灯效 局部柔光 生物光 LOGO设计 制作儿童绘本故事 换脸艺术 打造专属动漫头像 包装设计之美 建筑设计 如何转高清图 生成3D质感图标 生成微信表情包 探索美食摄影的奇妙之旅 蛋糕创意设…

电商项目part06 微服务网关整合OAuth2.0授权中心

微服务网关整合 OAuth2.0 思路分析 网关整合 OAuth2.0 有两种思路,一种是授权服务器生成令牌, 所有请求统一在网关层验证,判断权 限等操作;另一种是由各资源服务处理,网关只做请求转发。 比较常用的是第一种,把API网关…

Python语言实现React框架

迷途小书童的 Note 读完需要 6分钟 速读仅需 2 分钟 1 reactpy 介绍 reactpy 是一个用 Python 语言实现的 ReactJS 框架。它可以让我们使用 Python 的方式来编写 React 的组件,构建用户界面。 reactpy 的目标是想要将 React 的优秀特性带入 Python 领域,…

HTML总结1【转】

以下内容转载和参考自:w3school的HTML学习内容,HTML 简介 。 一、概述 HTML不是一种编程语言,它是超文本标记语言 (Hyper Text Markup Language),使用标记标签来描述网页内容。HTML标签是由尖括号包围的关键词,标签通…

机器学习笔记:KD树

1 引入原因 K近邻算法需要在整个数据集中搜索和测试数据x最近的k个点,如果一一计算,然后再排序,开销过大 引入KD树的作用就是对KNN搜索和排序的耗时进行改进 2 KD树 2.1 主体思路 以空间换时间,利用训练样本集中的样本点&…

HTTPS协议加密原理

目录 一、什么是HTTPS 二、什么是加密/解密 三、为什么要加密 四、常见的加密方式 1.对称加密 2. 非对称加密 五、HTTPS加密方式探讨 1.只使用对称加密 2.只使用非对称加密 3.非对称加密对称加密 4.非对称加密对称加密CA认证 六、总结 一、什么是HTTPS HTTP 协议&a…

Pytorch06-复杂模型构建

https://github.com/ExpressGit/Pytorch_Study_Demo 1、PyTorch 复杂模型构建 1、模型截图2、模型部件实现3、模型组装 2、模型定义 2.1、Sequential 1、当模型的前向计算为简单串联各个层的计算时, Sequential 类可以通过更加简单的方式定义模型。2、可以接收…

HTML5岗位技能实训室建设方案

一 、系统概述 HTML5岗位技能技术是计算机类专业重要的核心课程,课程所包含的教学内容多,实践性强,并且相关技术更新快。传统的课堂讲授模式以教师为中心,学生被动式接收,难以调动学生学习的积极性和主动性。混合式教学…

Linux--进程地址空间

1.线程地址空间 所谓进程地址空间(process address space),就是从进程的视角看到的地址空间,是进程运行时所用到的虚拟地址的集合。 简单地说,进程就是内核数据结构和代码和本身的代码和数据,进程本身不能…

【Linux】socket 编程基础

文章目录 📕 网络间的通信📕 socket 是什么1. socket 套接字2. 套接字描述符3. 基本的 socket 接口函数3.1 头文件3.2 socket() 函数3.3 bind() 函数struct sockaddr主机序列与网络序列 3.4 listen() 函数3.5 connect() 函数3.6 accept() 函数IP 地址风格…

3.BGP状态机和路由注入方式

BGP状态机 BGP路由的生成 不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将GP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。 BGP注入路由的方式有两种: Networkimport-route与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由…

Java 时间日期处理,工作必用(建议收藏)

工作中经常会遇到对时间日期进行处理的业务,像日期类的API个人觉得不需要背,需要的时候去查资料就行。我整理了Java8之前及之后日期类常用的时间日期处理方法,方便工作需要时查找,觉得有用的朋友可以收藏。 一、日期格式化和解析 …

linux挂载内网镜像源文件,支持yum安装

cd /etc/yum.repos.d/vim kylin_aarch64.repo 重建yum缓存 yum clean allyum makecacheyum repolist

RH1288V3 - 初识物理服务器

如果你拥有一台物理服务器(不是云服务器) 个人比较推荐你用物理服务器,虽然性能会比云要来的差,但是不用每月交钱上。云服务固然方便,但是几个核的性能和一点存储,想做一个动漫网站固然要很多mp4这种影视资源,云服务器…

积跬步至千里 || 数学基础、算法与编程

数学基础、算法与编程 1. BAP 技能 BAP 技能是指基础(Basic)、算法(Algorithm)和编程(Programm)三种基本技能的深度融合。理工科以数学、算法与编程为根基,这三个相辅相成又各有区别。 (1)数学以线性代数为主要研究工具和部分微积分技术为手…

最新绕过目标域名CDN进行信息收集技术

绕过目标域名CDN进行信息收集 1.CDN简介及工作流程 CDN(Content Delivery Network,内容分发网络)的目的是通过在现有的网络架构中增加一层新的Cache(缓存)层,将网站的内容发布到最接近用户的网…

打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因

今天,我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行,甚至崩溃。但是,请不要担心,我会为大家提供5种解决方法,帮助大家轻松解决问题。 首先,我们来看…

单片机学习-蜂鸣器电子元件

蜂鸣器是有什么作用的? 蜂鸣器 是 一种 一体化结构 的电子训响器,可以发出声音的电子元器件 蜂鸣器分类? ①压电式蜂鸣器(图左) 称: 无源蜂鸣器 ②电磁式蜂鸣器(图右) 称&#xf…

陪诊系统源码开发:实现个性化医疗陪护的创新之路

陪诊系统的源码开发在现代医疗中具有重要意义。本文将通过代码示例介绍陪诊系统的源码开发,展示如何实现个性化医疗陪护的创新方案。 1. 安装和环境设置: 首先,确保你的开发环境中已经安装了合适的编程语言和框架,比如Python和…

人力资源小程序的设计原则与实现方法

随着移动互联网的快速发展,小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说,开发一款定制化的小程序不仅可以提升服务效率,还可以增强品牌形象和用户粘性。那么,如何定制开发人力资源类的小程序呢?下面…