MySQL事务的隔离级别详情


Posted in MySQL onJuly 15, 2022

一、隔离级别的概念

为什么要考虑隔离级别?

因为事务要并发执行,而并发执行可能会出现一些问题:脏读、不可重复读和虚读,有的是允许出现的,有的不允许出现,对于这种不同程度上的出现或不出现的并发控制才有了不同的隔离级别。

MySQL支持的四种隔离级别是:

  • TRANSACTION_READ_UNCOMMITTED:未提交读。说明在提交前事务A可以看到事务B的变化。这样读脏数据,不可重复读和幻读都是被允许的。
  • TRANSACTION_READ_COMMITTED:已提交读(oracle默认),说明读取未提交的数据是不允许的(防止脏读)。在这个级别仍然允许不可重复读和幻读发生。
  • TRANSACTION_REPEATABLE_READ:可重复读(MySQL默认),说明事务保证能够再次读取相同的数据而不会失败,即使其他的事务把这个数据改了,你也不会看到前后两次查询的数据的不同。但是幻读仍然会出现。
  • TRANSACTION_SERIALIZABLE:串行化,是最高的事务隔离级别,它防止脏读,不可重复读和幻读。串行执行,相当于是单线程操作,并发能力最低

MySQL事务的隔离级别详情

注意:

事务隔离级别越高,为避免冲突所花费的性能也就越多,即效率低。在“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止update更新产生的虚读问题,要禁止虚读产生,还是需要设置串行化隔离级别。

MySQL客户端默认工作在可重复读级别:

MySQL事务的隔离级别详情

二、测试TRANSACTION_READ_UNCOMMITTED隔离级别

MySQL事务的隔离级别详情

MySQL事务的隔离级别详情

若此时A客户端rollback,数据库中zhangsan的年龄恢复到了20,这时候已经来不及了,因为B客户端已经拿着21去做业务了。

MySQL事务的隔离级别详情

两个客户端都rollback放弃对当前事务对数据做的修改,zhangsan年龄恢复为20

MySQL事务的隔离级别详情

三、测试TRANSACTION_READ_COMMITTED隔离级别

MySQL事务的隔离级别详情

MySQL事务的隔离级别详情

因为设置了已提交读隔离级别,所以事务B并没有发生脏读,这是由各种锁机制以及事务并发的MVCC版本控制实现的。

MySQL事务的隔离级别详情

查询到了已经commit的数据,发生了不可重复读,这在已提交读隔离级别是允许发生的。既然发生了不可重复读,幻读就肯定可以发生了。

四、测试TRANSACTION_REPEATABLE_READ隔离级别

MySQL事务的隔离级别详情

MySQL事务的隔离级别详情

可重复读在一定意义上可以防止幻读的出现,可以看到,当前的可重复读隔离级别,防止了insert。其实可重复读隔离级别可以防止insert和delete,不能防止update。

MySQL事务的隔离级别详情

实际上,事务A已经插入并且提交了,aaa已经存在,因为事务B update aaa的年龄成功了

前后两次同样的查询,后一次查询与前一次查询的数据量不同,就发生了幻读。也就是可重复读隔离级别下,并没有解决幻读的问题,要彻底解决幻读,就需要设置串行化隔离级别

五、测试TRANSACTION_SERIALIZABLE隔离级别

MySQL事务的隔离级别详情

MySQL事务的隔离级别详情

从现象看,串行化可以解决幻读,同样的条件进行查询,在另一个表里面插入数据时就被阻塞,由于事务B正在读数据,此时事务A再写数据就被阻塞了(用读写锁实现,允许读读,不允许读写或者写写)

MySQL server不会让自己执行事务的线程永远阻塞,导致当前线程占用的锁无法释放,而使得其他执行事务的线程也无法获得锁而永远阻塞。所以执行事务的线程都是带有时间的,当线程等待时间过长时,会让超时线程释放锁,并会返回一个错误:

MySQL事务的隔离级别详情

到此这篇关于MySQL事务的隔离级别详情的文章就介绍到这了,更多相关MySQL事务隔离级别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
Mysql中存储引擎的区别及比较
Jun 04 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
MySQL数据库⾼可⽤HA实现小结
Jan 22 MySQL
利用JuiceFS使MySQL 备份验证性能提升 10 倍
Mar 17 MySQL
MySQL 语句执行顺序举例解析
Jun 05 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 #MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 #MySQL
Mysql数据库group by原理详解
delete in子查询不走索引问题分析
Jul 07 #MySQL
MySQL提升大量数据查询效率的优化神器
mysql查看表结构的三种方法总结
Jul 07 #MySQL
MySQL中正则表达式(REGEXP)使用详解
You might like
JpGraph php柱状图使用介绍
2011/08/23 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
2010/05/13 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
Vue实现移动端页面切换效果【推荐】
2018/11/13 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
使用python实现扫描端口示例
2014/03/29 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
python微信好友数据分析详解
2018/11/19 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
毕业生的自我鉴定
2013/10/29 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
行政司机岗位职责
2015/04/10 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
《植树问题》教学反思
2016/03/03 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL
python神经网络Xception模型
2022/05/06 Python
Windows server 2016服务器基本设置
2022/08/14 Servers