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 ...
随机推荐
- 大白话Java多线程,小白都能看的懂的哦
什么是线程 说到线程我们应该先了解下什么是进程,下面这个图片大家应该都比较熟悉吧. 我们看到的这些单独运行的程序就是一个独立的进程,进程之间是相互独立存在的.我们上面图中的360浏览器.百度云盘等等都 ...
- cmd命令符大全
cmd命令大全(第一部分) winver---------检查Windows版本 wmimgmt.msc----打开windows管理体系结构(WMI) wupdmgr--------windows更 ...
- java使用正则的例子
package com.accord.util; import java.util.ArrayList; import java.util.List; import java.util.regex.M ...
- 项目中处理数据常用Excel公式
="'"&A1&"'," 需求:是大佬给了excel,里面是700多个单号,要我从生产的数据库中查询出每个单号对应的类型,这时需要查数据库,我决 ...
- docker进入mysql数据库并进行导入 导出
一:导入 1.首先查看docker运行的容器: docker ps 2.将宿主机文件拷贝到docker容器中: docker cp 2020415.sql af491d5466ea:/opt/2020 ...
- 【Java基础】Java10 新特性
Java10 新特性 局部变量类型推断 局部变量的显示类型声明,常常被认为是不必须的. 场景一:类实例化时.在声明一个变量时,总是习惯了敲打两次变量类型,第一次用于声明变量类型,第二次用于构造器. 场 ...
- ReentrantLock-源码解析
ReentrantLock类注释 1.可重入互斥锁,意思是表示该锁能够支持一个线程对资源的重复加锁,该锁还支持获取锁的公平和非公平性选择.synchronized关键字隐式的支持重进入. 2.可以通过 ...
- python函数2-函数参数
rgb法则:
- 诸葛 VS 庞统,拿下 Paxos 共识算法
前言 分布式确实是一个有趣的话题,只要你留心观察,分布式在生活中无处不在. 悟空哥最开始学习分布式是从一篇非常用心写的技术征文开始的,而且这篇文章获得了征文第一名,在此感谢掘金社区提供的平台.想学习的 ...
- win10/windows 安装Pytorch
https://pytorch.org/get-started/locally/ 去官网,选择你需要的版本. 把 pip install torch==1.5.0+cu101 torchvision= ...