Mysql 四种事务隔离级别
一、前提
时过一年重新拾起博文记录,希望后面都能坚持下来。 接着之前MySql的学习,先记录下这篇。
以下都是基于mysql8 innodb存储引擎进行分析的。
二、事务的ACID特性
A(Atomicity) 原子性
C(consistency) 一致性
I(isolation) 隔离性
D(durability) 持久性
三、事务的4种隔离级别
Read Uncommitted - 未提交读
| 步骤 | 事务1 | 事务2 |
| 1 |
设置隔离级别 mysql> set @@session.transaction_isolation |
|
| 2 |
开启事务1 mysql> begin; |
|
| 3 |
无需管隔离级别,只开启事务2并插入记录
mysql> begin; |
|
| 4 |
此时能查到事务2中未提交事务中的数据,这就是脏读。 mysql> select * from t; |
1 mysql> show variables like '%isolation%';
2 +-----------------------+------------------+
3 | Variable_name | Value |
4 +-----------------------+------------------+
5 | transaction_isolation | READ-UNCOMMITTED |
6 +-----------------------+------------------+
7 1 row in set (0.00 sec)
Read Committed - 提交读
| 步骤 | 事务1 | 事务2 |
| 1 | 先设置隔离级别
mysql> set @@session.transaction_isolation |
|
| 2 | 开启事务1,查询t表记录为空
mysql> begin; |
|
| 3 |
无需管隔离级别,只开启事务2并插入记录 mysql> begin; |
|
| 4 |
继续查询表t依然显示为空 (没有读取到事务2未提交的数据,所以不存在脏读问题) mysql> select * from t; |
|
| 5 |
提交事务2 mysql> commit; |
|
| 6 |
继续查询表t,此时能查询事务2已提交的数据记录(出现前后查询不一致) mysql> select * from t; |
Repeatable Read - 可重复读
| 步骤 | 事务1 | 事务2 |
| 1 |
设置隔离级别 mysql> set @@session.transaction_isolation |
|
| 2 |
开启事务1,并查询 mysql> begin; |
|
| 3 |
无需管隔离级别,只开启事务2并插入记录 mysql> begin; |
|
| 4 | 继续查询表t依然只有一条记录id=3
(没有读取到事务2未提交的数据,所以不存在脏读问题) mysql> select * from t; |
|
| 5 |
将第二个窗口中的事务提交。
mysql> commit; |
|
| 6 | 继续查询表t依然只有一条记录id=3
(没有读取到事务2已提交的数据,所以不存在不可重复读问题) mysql> select * from t; |
|
| 7 |
接着插入一条4的记录,但提示插入不了,提示主键冲突问题。
然而查询却没有这条id=4记录。 这就是幻读现象。
mysql> insert into t select 4, '4'; |
|
| 8 | 另一种幻读现象:接着上面操作,不插入记录只更新记录,将name 更新成 '5'后,发现有两行受影响 | |
mysql> update t set name = '5'; |
||
| 步骤 | 事务1 | 事务2 |
| 9 |
查询时加上间隙锁 mysql> begin; mysql> select * from t where id > 0 for update; |
|
| 10 |
插入记录为6的数据就会发现插入这条记录获取锁超时,自动异常 insert into t select 6, '6'; |
Serializable - 可串行化
四 总结
1、脏读:在一个事务中会读取到其未提交事务的数据,此种现象也称之为脏读
2、不可重复读:一个事务可以读取另一个已提交的事务,多次读取会造成不一样的结果。这种现象也被称为不可重复读
3、幻读:基于可重复读的基础上查询结果是一样的,但是当对某些行进行更新或者插入时却会受到影响操作不了,就形成了幻读。
|
隔离级别
|
脏读
|
不可重复读
|
幻读
|
|
读未提交(uncommitted read)
|
可能出现
|
可能出现
|
可能出现
|
|
读提交(committed read)
|
不会出现
|
可能出现
|
可能出现
|
|
可重复读(Repeatable Read)
|
不会出现
|
不会出现
|
可能出现(加上间隙锁就不会)
|
|
可串行化(Serializable)
|
不会出现
|
不会出现
|
不会出现
|
五 参考文献
《MySql 技术内幕(Innodb)第二版》
https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
Mysql 四种事务隔离级别的更多相关文章
- mysql四种事务隔离级别
mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...
- MySQL四种事务隔离级别详解
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- MySQL 四种事务隔离级别详解及对比--转
http://www.jb51.net/article/100183.htm 接的隔离级别.它的语法如下: ? 1 SET [SESSION | GLOBAL] TRANSACTION ISOLATI ...
- mysql锁及四种事务隔离级别笔记
前言 数据库是一个共享资源,为了充分利用数据库资源,发挥数据 库共享资源的特点,应该允许多个用户并行地存取数据库.但这样就会产生多个用户程序并 发存取同一数据的情况,为了避免破坏一致性,所以必须提供并 ...
- Mysql 四种事务隔离介绍以及锁机制
还有很多不太懂,这里收集几份大佬文章“飞机票”,待我整理好了,再好好写一篇文章吧. MySQL的四种事务隔离级别 https://www.cnblogs.com/huanongying/p/70215 ...
- MySQL的四种事务隔离级别
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- [转载] MySQL的四种事务隔离级别
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- MySQL的四种事务隔离级别【转】
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐 级之间的区别?
SQL 标准定义的四个隔离级别为: 1.read uncommited :读到未提交数据 2.read committed:脏读,不可重复读 3.repeatable read:可重读 4.seria ...
随机推荐
- CentOS7服务器JDK8安装实战
简介:演练JDK8环境的安装 下载jdk官网: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...
- harbor安装实操笔记
纸上得来终觉浅,实操一遍吧! 把所有开发的后端服务先在打成镜像,传到私有镜像仓库: 然后在任意的远程机器拉取镜像,然后可采用docker或者docker-compose的方式运行,本节先按照docke ...
- JDBC访问数据库的基本步骤是什么?
1.加载(注册)数据库驱动(到JVM) 2.建立(获取)数据库连接. 3.创建(获取)数据库操作对象. 4.定义操作的SQL语句. 5.执行数据库操作. 6.获取并操作结果集. 7.关闭对象,回收数据 ...
- MySQL性能分析show profiles详解
前言 前几篇文章我们讲了什么是 MySQL 索引,explain分析SQL语句是否用到索引,以及索引的优化等一系列的文章,今天我们来讲讲Show profiles,看看SQL耗时到底出现在哪个环节. ...
- centos7下mysql安装与卸载
彻底卸载mysql 一.chak 是否有安装mysql a) rpm -qa | grep -i mysql // 查看命令1 b) yum list install mysql* ...
- 图解SparkStreaming与Kafka的整合,这些细节大家要注意!
前言 老刘是一名即将找工作的研二学生,写博客一方面是复习总结大数据开发的知识点,一方面是希望帮助更多自学的小伙伴.由于老刘是自学大数据开发,肯定会存在一些不足,还希望大家能够批评指正,让我们一起进步! ...
- 设计模式之单例模式(Singleton Pattern)深入浅出
单例模式介绍:单例模式是指确保一个类在任何情况下都绝对只有一个实例,并且提供一个全局的访问点.隐藏其所有构造方法,属于创新型模式. 常见的单例有:ServletContext.ServletConfi ...
- 杭电OJ2010---水仙花数(c++)(方法:输出几个数之间用空格隔开,最后一个数没有空格)
水仙花数 Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: "水仙花数"是指一个三位数,它的各位数字的立方 ...
- 在Docker下搭建MySQL双主双重集群(单机展示,与多机原理一致)
前言 Docker的安装部署&在Docker下MySQL的安装与配置 https://www.cnblogs.com/yumq/p/14253360.html 在Docker进行单机主从复制M ...
- oracle 11.2.0.1.0 升级 11.2.0.4.0 并 patch 到11.2.0.4.7
升级步骤: (1) 备份数据库 (2) 运行patchset,升级oracle 软件 (3) 准备新的ORACLE_HOME (4) 运行dbua 或者脚本升级实例 (5) ...