作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第二篇,总结了MySQL的事务隔离级别。

上一篇:MySQL核心知识学习之路(1)

1 MySQL的事务隔离级别

所谓隔离,它源自于我们熟知的事务的ACID四大特性之一的Isolation隔离性。

如果事务之间不隔离,那么可能会发生以下几个问题:

(1)脏读

脏读指的是读到了其他事务未提交的数据,而这些数据可能会被回滚。

(2)不可重复读

不可重复读值的是在同一事务内,不同时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对UPDATE操作。

(3)幻读

幻读指的是一个事务在进行一次查询之后发现某个记录不存在,然后会根据这个结果进行下一步操作,此时如果另一个事务成功插入了该记录,那么对于第一个事务而言,其进行下一步操作(比如插入该记录)的时候很可能会报错。通常针对INSERT操作。

为了解决这些问题,在MySQL中,提供了如下四种事务的隔离级别:

  • 读未提交(Read Uncommitted)

    • 一个事务还未提交,它所做的变更就可以被别的事务看到

  • 读提交(Read Committed)

    • 一个事务提交之后,它所做的变更才可以被别的事务看到

  • 可重复读(Repeatable Read):默认隔离级别

    • 一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的

  • 串行化(Searializable)

    • 对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行

如上四种隔离级别,并行性能依次降低,安全性则依次提高!

在MySQL中,可以通过以下命令查看当前设置的事务隔离级别,默认隔离级别为可重复读(Repeatable Read)。

mysql> show variables like 'transaction_isolation';

如果要修改默认隔离级别为读提交:(以下为修改全局事务隔离级别)

mysql> set global transaction isolation level read committed;

事务隔离是为了解决脏读、不可重复读、幻读这几个问题,下图展示了这四种隔离级别对这三个问题的解决程度:

可以看到,只有串行化的隔离级别解决了全部问题,其他的隔离级别都各有缺陷。不过,串行化虽然可以解决所有问题,但是并发性能最差。

2 隔离级别小练习

现在我们来看一个小练习,假设我们通过以下语句创建一张表T,并向表T插入了一个新数值1:

mysql> create table T(c int) engine=InnoDB;insert into T(c) values(1);

然后,看看如下所示的图片,假设有两个事务分别启动,看看在不同的隔离级别下不同事务查询得到的值V1、V2和V3分别是多少?

图片来源:林晓斌《MySQL实战45讲》

(1)隔离级别=读未提交,V1=V2=V3=2

(2)隔离级别=读提交,V1=1,V2=V3=2

(3)隔离级别=可重复读,V1=V2=1,V3=2

(4)隔离级别=串行化,V1=V2=1,V3=2

3 事务隔离的实现

在MySQL中,每条记录在更新的时候都会同时记录一条回滚操作。因此,记录上的最新的值,通过回滚操作,可以得到前一个状态的值。换句话说,同一条记录在系统中可以存在多个版本,这其实就是MySQL数据库的多版本并发控制(MVCC)

综述,可以说MySQL事务隔离的实现基础是基于多版本并发控制MVCC的,而具体的实现方式就是回滚日志。即每个事务的都会在自己的一致性读视图(Consistent Read View,这个视图没有物理结构,用来在事务执行期间定义“我能看到什么数据”)中对记录进行操作,并记录回滚日志,但是不同事务之间是不会冲突的。

鉴于此,由于长事务会存在很老的事务视图,在其未提交之前,可能用到的所有回滚记录都需要保留,会占用大量存储空间。所以,建议尽量不要使用长事务

如果必须要用,那么需要对其进行监控,下面的语句可以指导我们查找时间超过60s的长事务:

-- 查找持续时间超过60s的长事务
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60

4 事务的启动方式

在实践中,MySQL的事务启动方式有以下两种:

(1)显示启动事务(begin/start transaction -> commit/rollback)

(2)显示关闭自动提交(set autocommit=0)

5 小结

本文总结了MySQL的事务隔离级别、实现方式 及 启动方式,可以帮助我们使用好MySQL的事务特性。

参考资料

林晓斌(丁奇),《MySQL实战45讲》

扫码订阅《MySQL实战45讲》

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

MySQL核心知识学习之路(2)的更多相关文章

  1. 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享

    近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...

  2. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

  3. MYSQL+PHP的学习之路

    MYSQL+PHP 先从MYSQL开始吧 第一步:SQL语句基础 1.书籍 2.网站: 这个网站在线测试和考试http://sqlzoo.net/wiki/SELECT_basics/zh 3.学习过 ...

  4. mysql 核心知识要点

    整体知识介绍:mysql基本操作和使用,mysql优化(索引,分表等),mysql部署(读写分离,负载均衡等) 数据库基本介绍:数据库概念,常用数据库,web应用三大软件分工,PHP动态语言特点(处理 ...

  5. MySQL核心知识

    MySQL常用的命令 启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库 ...

  6. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

  7. MySQL学习之路(一)——初涉MySQL。

    MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...

  8. Docker 与 K8S学习笔记(二)—— 容器核心知识梳理

    本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...

  9. 阿里封神谈hadoop学习之路

    阿里封神谈hadoop学习之路   封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...

  10. 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)

    七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...

随机推荐

  1. Java WatchService监控指定路径下的文件新增、删除和修改(子文件夹、指定文件类型)

    WatchService 是 Java NIO 包 (java.nio.file) 中提供的一个用于监控文件系统变化的 API.它允许应用程序监听目录中的文件创建.修改和删除事件. 基本原理 Watc ...

  2. Golang HTTPS

    用golang来实现的webserver通常是是这样的 //main.go package main import ( "fmt" "io" "net ...

  3. SLAM导航全栈书的正确打开姿势

    SLAM导航全栈书的正确打开姿势 随着人工智能.机器人.无人驾驶等技术的蓬勃发展,作为底层技术基石的SLAM也逐渐被大家所熟知.人工智能技术如果仅仅停留在虚拟的网络和数据之中的话,那么它挖掘并利用知识 ...

  4. 2025年最流行的5个Python ASGI服务器及其核心特性与适用场景

    以下是2025年最流行的5个Python ASGI服务器及其核心特性与适用场景: 1. Uvicorn • 核心优势: • 基于uvloop和httptools,性能远超传统WSGI服务器,支持HTT ...

  5. Model Context Protocol

    MCP is an open protocol that enables AI models to securely interact with local and remote resources ...

  6. C++宏定义中可变参数列表__VA_ARGS__ 及 QT 提供的宏 QT_OVERLOADED_MACRO

    1. 基本用法 VA_ARGS 是 C/C++ 中的预定义宏,用于在宏定义中表示可变参数列表(Variadic Arguments),需与省略号 ... 配合使用.其核心作用是将宏调用中的可变参数原样 ...

  7. 🔥Gitlab 删除仓库文件夹

    1.进入文件夹 -> 右键 -> Git Bash Here -> 打开命令窗口 2.拉取代码到本地 (本地无项目情况) git clone git地址 3.拉取最新代码(本地已有项 ...

  8. Java 单元测试简单扫盲

    前言 仔细回想起来,上次认真编写单元测试已经是两年前的事了.那时候觉得写单元测试是种负担. 为了应付代码覆盖率要求,常常依赖工具自动生成测试用例,有时需要启动Spring容器,有时又不需要(当时还分不 ...

  9. ThinkPHP 中闭包在数组查询条件中的深度应用

    一.闭包与数组条件的协同原理 在 ThinkPHP 的查询体系中,数组条件是构建查询逻辑的核心载体.当数组条件的值为闭包(Closure)时,框架会自动将其解析为动态子查询生成器,实现运行时按需构建 ...

  10. 毒瘤idea合集

    给定 \(n,m\) ,求: \[\sum_{i=1}^{n}\sum_{i=1}^{m}max\big(gcd(i,j)^i,lcm(i,j)^j\big) \]