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 ...
随机推荐
- Oracle中除数为0的两种解决办法(decode与nullif)
Oracle中Decode函数,语句DECODE(tag,''ZCGS'',0,1)=decode(''@corp-No@'',''6010'',1,0) decode(字段或字段的运算,值1,值2, ...
- Head First 设计模式 —— 02. 观察者 (Observer) 模式
思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...
- RewriteCond 和RewriteRule规则说明 (转)
Apache的Mod_rewrite学习 (RewriteCond重写规则的条件)收藏RewriteCond Syntax: RewriteCond TestString CondPattern [f ...
- Java进阶基础18天课程大总结
知识点目录 day1:分类思想,static关键字 day2:面向对象-继承,抽象类,权限修饰符,final day3:接口,多态 day4:内部类,Lambda day5:工具类API,系统API, ...
- java对象
原文链接http://zhhll.icu/2020/04/26/java%E5%9F%BA%E7%A1%80/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/java%E5% ...
- 在Linux系统下限制指定目录的大小以及文件/文件夹数量
背景说明 在Linux操作系统下有时需要限制一个指定文件夹的大小和文件夹内可存储的文件数量,有可能是出于安全的考量或者定制化的配置,这里我们提供了一种方案:用dd创建一个空的img镜像,进行格式化的配 ...
- 微信小程序request请求的封装
目录 1,前言 2,实现思路 3,实现过程 3.1,request的封装 3.2,api的封装 4,实际使用 1,前言 在开发微信小程序的过程中,避免不了和服务端请求数据,微信小程序给我们提供了wx. ...
- 【Web】HTML入门小结
文章目录 HTML? HTML 初识元素/标签 HTML语义化标签 标题 段落 font HTMl链接 HTML图像 HTML列表 HTML div HTML 块级元素与行内元素 HTML常用带格式作 ...
- 【Oracle】查看oracle表空间大小及增加表空间的几种方法
在oracle中表空间是必不可少的.但是怎么查看表空间呢 简单的查看方式是: SQL> select tablespace_name from dba_tablespaces; 想要查看表空间对 ...
- Getshell
GetShell 常用免杀大法 一.编码大法 (1).一句话马子本身采用编码 原文:<?php @eval($_GET(a)):?> 转码后:在提交的post的时候可以直接使用\u0026 ...