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 ...
随机推荐
- 进入mysql数据库修改密码
mysql -hlocalhost -uroot -p #修改密码mysql> set password for root@localhost = password('root');#启动数据库 ...
- 前端网页打印插件print.js(可导出pdf)
在前端开发中,想打印当前网页的指定区域内容,或将网页导出为多页的PDF,可以借助print.js实现,该插件轻量.简单.手动引入.不依赖其他库.示范项目github:https://github.co ...
- 【kinetic】操作系统探索总结(五)创建简单的机器人模型smartcar
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify } a:link { color: r ...
- Jquery真的不难~第一回 编程基础知识
Jquery真的不难~第一回 编程基础知识 回到目录 前言 说Jquery之前,先来学习一下Javascript(以后简称为JS)语言中的基础知识问题,其时对于每种编程语言来说基础知识都是大同小异 ...
- cmake - 可执行文件
1.生成可执行文件 add_executable(hello xxx.cpp xxxxx.cpp) ##根据文件xxx.cpp和xxxx.cpp生成可执行文件hello,但是这两个可执行文件如果依赖其 ...
- NC65在日常开发中常用的代码写法
标题 NC65开发相关代码 版本 1.0.1 作者 walton 说明 收集NC在日常开发中常用的代码写法,示例展示 1.查询 1.1 通过BaseDAO查询结果集并转换 //通过BaseDAO进行查 ...
- 如何使用Pycharm在网页上展示诗歌。(HTML)
!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g ...
- Head First 设计模式 —— 12. 状态 (State) 模式
思考题 public class GumballMachine { final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; fi ...
- 如何实现一个简易版的 Spring - 如何实现 Constructor 注入
前言 本文是「如何实现一个简易版的 Spring」系列的第二篇,在 第一篇 介绍了如何实现一个基于 XML 的简单 Setter 注入,这篇来看看要如何去实现一个简单的 Constructor 注入功 ...
- char什么时候会用空格进行填充?
char什么时候会用空格进行填充?