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

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

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

相关文章

响应式布局bootstrap使用

响应式布局 学习目标 能够说出响应式原理 能够使媒体查询完成响应式导航 能够使用Bootstrap的栅格系统 能够使用bootstrap的响应式工具 1.响应式原理 1.1响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的 1.2响应式布局容器…

顺序表之初

欢迎来到我的:世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 线性表简介顺序表定义动态顺序表的初始化尾插头插Cheak 判断是否增容尾删:头删:打印在pos位置前插入x删除pos位置的值查…

centos7搭建apache作为文件站后,其他人无法访问解决办法

在公司内网的一个虚拟机上搭建了httpsd服务,准备作为内部小伙伴们的文件站,但是搭建好之后发现别的小伙伴是无法访问我机器的。 于是寻找一下原因,排查步骤如下: 1.netstat -lnp 和 ps aux 先看下端口和 服务情况 发现均正常 2.…

Linux(基础篇一)

Linux基础篇 Linux基础篇一1. Linux文件系统与目录结构1.1 Linux文件系统1.2 Linux目录结构 2. VI/VIM编辑器2.1 vi/vim是什么2.2 模式间的转换2.3 一般模式2.4 插入模式2.4.1 进入编辑模式2.4.2 退出编辑模式 2.5 命令模式 3. 网络配置3.1 网络连接模式3.2 修改静态ip3.3 配置…

python中的matplotlib画直方图(数据分析与可视化)

python中的matplotlib画直方图(数据分析与可视化) import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns",None) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]Fa…

Linux TCP协议——三次握手,四次挥手

一、TCP协议介绍 TCP协议是可靠的、面向连接的、基于字节流的传输层通信协议。 TCP的头部结构: 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;(tcp是传输层的协议,端与端之间的数据传输,在TCP和UDP协议当中不会体现出I…

[Linux]命令行参数和进程优先级

[Linux]命令行参数和进程优先级 文章目录 [Linux]命令行参数和进程优先级命令行参数命令行参数的概念命令函参数的接收编写代码验证 进程优先级进程优先级的概念PRI and NI使用top指令修改nice值 命令行参数 命令行参数的概念 命令行参数是指用于运行程序时在命令行输入的参数…

软件设计师学习笔记3-CPU组成

目录 1.计算机结构 1.1计算机的外设与主机 1.2计算机各部分之间的联系(了解一下即可) 2.CPU结构 1.计算机结构 1.1计算机的外设与主机 1.2计算机各部分之间的联系(了解一下即可) 该图片来自希赛软考 注:黄色的是传递数据的数据总线,白色的是传递控…

AI新时代,英特尔如何加强产学研融合?

人工智能作为当前数字经济发展的核心驱动力,我们在关注AI技术发展之际,为发挥AI强大助力,更需进一步思考AI的科研、产业应用与人才培育的工作,推动产学研融合创新。 正如英特尔公司高级副总裁、英特尔中国区董事长王锐在刚结束的…

【C++】C/C++内存管理-new、delete

文章目录 一、C/C内存分布二、C/C中动态内存管理方式2.1 C语言中动态内存管理方式2.2 C内存管理方式 三、operator new和operator delete函数3.1 operator new和operator delete函数3.2 operator new与operator delete的类专属重载(了解) 四、new和delet…

算法与数据结构(九)--并查集

并查集是一种树型的数据结构,并查集可以高校地进行如下操作: *查询元素p和元素q是否在同一组 *合并元素p和元素q所在的组 一.并查集结构 并查集也是一种树型结构,这种树的要求比较简单:1.每个元素都唯一的对应一个结点&#xff…

基于SSM的小说网站的设计与实现(论文+源码)_kaic

目 录 1 绪论................................................................................................... 1 1.1 项目背景................................................................................................................ 1 1.2 发展历程..…

Java学数据结构(2)——树Tree 二叉树binary tree 二叉查找树 AVL树 树的遍历

目录 引出什么是树Tree?树的实现二叉树binary tree查找树ADT——二叉查找树Binary Search Tree1.contains方法2.findMax和findMin方法3.insert方法4.remove方法(复杂)二叉查找树的深度 AVL(Adelson-Velskii和Landis)树——**平衡条件(balance…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【三】

😀前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【三】的分享,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我…

【Jenkins】持续集成部署学习

【Jenkins】持续集成部署学习 【一】安装部署【1】Jenkins所处位置【2】Docker安装Gitlab(1)首先准备一台空的虚拟机服务器(2)安装服务器所需的依赖(3)Docker的安装(4)阿里云镜像加速…

VUE笔记(十)Echarts

一、Echarts简介 1、什么是echarts ECharts是一款基个基于 JavaScript 的开源可视化图表库 官网地址:Apache ECharts 国内镜像:ISQQW.COM x ECharts 文档(国内同步镜像) - 配置项 示例:echarts图表集 2、第一个E…

大语言模型之五 谷歌Gemini

近十年来谷歌引领着人工智能方向的发展,从TensorFlow到TPU再到Transformer,都是谷歌在引领着,然而,在大语言模型上,却被ChatGPT(OpenAI)抢了风头,并且知道GPT-4(OpenAI&a…

红蓝攻防:浅谈削弱WindowsDefender的各种方式

前言 随着数字技术的日益进步,我们的生活、工作和娱乐越来越依赖于计算机和网络系统。然而,与此同时,恶意软件也日趋猖獗,寻求窃取信息、破坏系统或仅仅为了展现其能力。微软Windows,作为世界上最流行的操作系统&…

2023年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:和数 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536 输入 共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个…

商品搜索网:连接您与各类商品的桥梁

导语&#xff1a;在如今信息爆炸的时代&#xff0c;购物已经不再是传统的实体店购买&#xff0c;而是通过互联网实现的线上购物方式。而要实现高效的线上购物&#xff0c;商品搜索引擎则成为我们的得力助手。作为国内垂直的商品搜索之一&#xff0c;为中国用户提供全面的数码电…