MySQL核心知识学习之路(2)
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下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讲》


MySQL核心知识学习之路(2)的更多相关文章
- 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享
近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...
- MySQL索引知识学习笔记
目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...
- MYSQL+PHP的学习之路
MYSQL+PHP 先从MYSQL开始吧 第一步:SQL语句基础 1.书籍 2.网站: 这个网站在线测试和考试http://sqlzoo.net/wiki/SELECT_basics/zh 3.学习过 ...
- mysql 核心知识要点
整体知识介绍:mysql基本操作和使用,mysql优化(索引,分表等),mysql部署(读写分离,负载均衡等) 数据库基本介绍:数据库概念,常用数据库,web应用三大软件分工,PHP动态语言特点(处理 ...
- MySQL核心知识
MySQL常用的命令 启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库 ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- MySQL学习之路(一)——初涉MySQL。
MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...
- Docker 与 K8S学习笔记(二)—— 容器核心知识梳理
本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...
- 阿里封神谈hadoop学习之路
阿里封神谈hadoop学习之路 封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...
- 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)
七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...
随机推荐
- 【JVM之内存与垃圾回收篇】垃圾回收相关概念
垃圾回收相关概念 System.gc() 的理解 在默认情况下,通过 System.gc() 或者 Runtime.getRuntime().gc() 的调用,会显式触发 FullGC,同时对新生代. ...
- DeepSeek 聊天机器人项目
想要更深入玩转聊天机器人开发? 推荐本文档 + 课程<DeepSeek 聊天机器人项目>一起学习,效果翻倍! 边学边练,轻松打造智能对话系统~ (๑•̀ㅂ•́)و✧ 快上车,AI 之旅发车 ...
- LLMOps MLOPS
https://www.redhat.com/en/topics/ai/llmops https://www.redhat.com/en/topics/cloud-computing/what-is- ...
- 从DeepSeek看算法备案&大模型备案
一.deepseek的备案情况 (一)算法备案情况 在算法备案系统网站上,北京深度求索人工智能基础技术研究有限公司和杭州深度求索人工智能基础技术研究有限公司分别进行了两个算法备案.从公司名称来看,正如 ...
- ReadWriteLock:读写锁
一. /* * 1. ReadWriteLock : 读写锁 * * 写写/读写 需要"互斥" * 读读 不需要互斥 * */ public class TestReadWrite ...
- SpringBoot3整合SpringSecurity6(一)快速入门
大家好,我是晓凡. 写在前面 不知道小伙伴们在学SpringSecurity过程中有没有和我一样的经历和烦恼. ①看完一篇文章或者一个教程,感觉学会了.但是一到实际项目中就不知道怎么用: ②被Spri ...
- jmeter之多并发
1.做压力测试时需要设置线程数,2.造数据时跑多接口多条数据需要设置线程数,并且保证每个线程的多接口顺序执行.3.需要设置数据不重复或者自增 一.设置线程数 主要用于压力测试需要多并发时设置线程数,以 ...
- MVVM_UI和逻辑分离(事件利用命令替换),命令代替事件,命令传递事件参数,附完整demo
近期公司重构了些界面,因为换肤和界面定制的缘故,需要把样式和逻辑分开:所以记录下关键的操作:主要是利用命令代替事件,利用命令传递事件的参数... 先大致看下效果: 主要是利用 Prism 库,可直接利 ...
- 工具 | burpgpt
0x00 简介 burpgpt是一款利用AI来检测安全漏洞的burpsuite插件.Burp Suite GPT扩展集成了OpenAI的GPT,以执行额外的被动扫描以发现高度定制的漏洞,并支持运行任何 ...
- 从零开始学Flink:开启实时计算的魔法之旅
在凌晨三点的数据监控大屏前,某电商平台的技术负责人突然发现一个异常波动:支付成功率骤降15%.传统的数据仓库此时还在沉睡,而基于Flink搭建的实时风控系统早已捕捉到这个信号,自动触发预警机制.当运维 ...