mysql数据库隔离级别详解


Posted in MySQL onJune 16, 2022

隔离级别

一、mysql有四个事务隔离级别

每个级别都有字符或数字编号

  1. 读未提交 READ UNCOMMITTED | 0 : 存在脏读,不可重复度,幻读的问题。 
  2. 读已提交 READ COMMITTED | 1 : 解决脏读问题,存在不可重复读,幻读的问题。
  3. 可重复读 REPEATABLE READ | 2 : 解决脏读,不可重复读的问题,存在幻读,默认隔离级别,使用MVCC机制实现可重复读。
  4. 序列化 SERIALIZABLE | 3 : 解决脏读,不可重复读,幻读,可保证事务安全,但完全串行执行,性能最低。

我有记忆方法,先是RU、RC, 记住UC顺序,联想到UC WEB。

二、为什么默认RR隔离级别?

RR级别作为mysql事务默认隔离级别,是事务完全和性能的折中。SERIALIZABLE级别是悲观地认为幻读时刻都会发生,故会自动地隐式地对事务所需资源加排他锁,其他事务访问此资源会被阻塞等待,故事务是安全的,但需要认值考虑性能。

三、RR隔离级别下手动加锁解决幻读理论基础

InnoDB的行锁锁定的是索引,而不是记录本身。索引映射的记录存在就加行锁,如果不存在则会加next-key lock/gap锁/间隙锁, 故InnoDB可以实现事务对某记录的预先占用。

脏读、不可重复读、幻读 及其解决方法

脏读

  • 一个事务读取到另一个事务还没有提交的数据。解决方法:把事务隔离级别调整到READ COMMITTED。

不可重复读

  • 一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。解决方法:把事务隔离级别调整到REPEATABLE READ。

幻读

  • 网上很多文章都说一个事务执行范围查询,两次select得到的条数不同,就叫幻读,这是错误的!!!
  • 幻读并不是说两次读取获取的结果集不同,幻读是指某一次select操作得到的结果所表征的数据状态无法支持后续的业务操作,具体例子:select某记录是否存在,不存在,准备插入此记录,但执行insert时发现此记录已存在,无法插入,此时就发生了幻读。
  • 还一种理解思路,就是因为先采用了"快照读",然后又用了"当前读",发现结果不同。比如先select是快照读,然后update、insert等,这时会用到当前读,发现操作出现未预料结果。

幻读解决方法

1、把事务隔离级别调整到SERIALIZABLE。2、RR隔离级别下,对select操作手动加行锁,select ... for update,这也序列化隔离级别下隐式会做的事。

参考文章

幻读  https://segmentfault.com/a/1190000016566788

事务隔离级别命令行操作

1、查看隔离级别

1)查看当前会话隔离级别

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

2)查看系统隔离级别

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-UNCOMMITTED      |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

2、设置隔离级别

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

1)设置当前会话

mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)

2)设置系统

mysql> set global transaction isolation  level read uncommitted;                
Query OK, 0 rows affected (0.00 sec)3、命令行,开始事务时用

操作验证

自己在命令行去验证几种隔离级别下的读问题。

一、实现脏读

在不可提交读, 也就是READ UNCOMMITED情况下,会产生脏读。

mysql数据库隔离级别详解

二、操作验证--实现不可重复读

在可提交读, 也就是READ COMMITED情况下,会产生不可重复读。

mysql数据库隔离级别详解

三、操作验证--解决不可重复读

repeatable read(MySQL默认隔离级别),这时候能解决可重复读。

右边事务提交了,修改了age=29,左边再次查询,还是28。

mysql数据库隔离级别详解

四、操作验证--实现幻读

repeatable read(MySQL默认隔离级别),这时候还会出现幻读。

mysql数据库隔离级别详解

总结

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

MySQL 相关文章推荐
MySQL锁机制
Apr 05 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
Nov 02 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
优化Mysql查询的示例
Apr 26 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
MYSQL事务的隔离级别与MVCC
May 25 MySQL
sql注入报错之注入原理实例解析
Jun 10 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 #MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 #MySQL
MySQL数据库之存储过程 procedure
Jun 16 #MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 #MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 #MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 #MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 #MySQL
You might like
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
javascript removeChild 使用注意事项
2009/04/11 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
Python 装饰器使用详解
2017/07/29 Python
Python Pillow Image Invert
2019/01/22 Python
python+django+rest框架配置创建方法
2019/08/31 Python
python selenium循环登陆网站的实现
2019/11/04 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
中层竞聘演讲稿
2014/01/09 职场文书
优秀学生评语大全
2014/04/25 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
降价通知函
2015/04/23 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
redis 查看所有的key方式
2021/05/07 Redis
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript