转自  https://www.cnblogs.com/snsdzjlz320/p/5761387.html

  • 第1级别:Read Uncommitted(读取未提交内容)
  • 第2级别:Read Committed(读取提交内容)
  • 第3级别:Repeatable Read(可重读)
  • 第4级别:Serializable(可串行化)
  • 参考文章

SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。

低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

首先,我们使用 test 数据库,新建 tx 表,并且如图所示打开两个窗口来操作同一个数据库:


第1级别:Read Uncommitted(读取未提交内容)

(1)所有事务都可以看到其他未提交事务的执行结果
(2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
(3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据

#首先,修改隔离级别set tx_isolation='READ-UNCOMMITTED';
select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+#事务A:启动一个事务
start transaction;
select * from tx;
+------+------+ | id | num | +------+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+ #事务B:也启动一个事务(那么两个事务交叉了)       在事务B中执行更新语句,且不提交 start transaction; update tx set num=10 where id=1; select * from tx; +------+------+ | id | num | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+ #事务A:那么这时候事务A能看到这个更新了的数据吗? select * from tx; +------+------+ | id | num | +------+------+ | 1 | 10 |   --->可以看到!说明我们读到了事务B还没有提交的数据 | 2 | 2 | | 3 | 3 | +------+------+ #事务B:事务B回滚,仍然未提交 rollback; select * from tx; +------+------+ | id | num | +------+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+ #事务A:在事务A里面看到的也是B没有提交的数据 select * from tx; +------+------+ | id | num | +------+------+ | 1 | 1 |      --->脏读意味着我在这个事务中(A中),事务B虽然没有提交,但它任何一条数据变化,我都可以看到! | 2 | 2 | | 3 | 3 | +------+------+


第2级别:Read Committed(读取提交内容)

(1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
(2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
(3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。
     |——>导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit

#首先修改隔离级别set tx_isolation='read-committed';
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+#事务A:启动一个事务
start transaction;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+#事务B:也启动一个事务(那么两个事务交叉了)       在这事务中更新数据,且未提交
start transaction; update tx set num=10 where id=1; select * from tx; +------+------+ | id | num | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+ #事务A:这个时候我们在事务A中能看到数据的变化吗? select * from tx; ---------------> +------+------+                | | id | num |                | +------+------+                | | 1 | 1 |--->并不能看到!  | | 2 | 2 |                | | 3 | 3 |                | +------+------+                |——>相同的select语句,结果却不一样                                | #事务B:如果提交了事务B呢?         | commit;                        |                                | #事务A:                         | select * from tx; ---------------> +------+------+ | id | num | +------+------+ | 1 | 10 |--->因为事务B已经提交了,所以在A中我们看到了数据变化 | 2 | 2 | | 3 | 3 | +------+------+


第3级别:Repeatable Read(可重读)

(1)这是MySQL的默认事务隔离级别
(2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
(3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
(4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

#首先,更改隔离级别set tx_isolation='repeatable-read';
select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+#事务A:启动一个事务
start transaction;
select * from tx;
+------+------+
| id | num | +------+------+ |  1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+ #事务B:开启一个新事务(那么这两个事务交叉了)       在事务B中更新数据,并提交 start transaction; update tx set num=10 where id=1; select * from tx; +------+------+ | id | num | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+ commit; #事务A:这时候即使事务B已经提交了,但A能不能看到数据变化? select * from tx; +------+------+ | id | num | +------+------+ |  1 | 1 | --->还是看不到的!(这个级别2不一样,也说明级别3解决了不可重复读问题) | 2 | 2 | | 3 | 3 | +------+------+ #事务A:只有当事务A也提交了,它才能够看到数据变化 commit; select * from tx; +------+------+ | id | num | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+


第4级别:Serializable(可串行化)

(1)这是最高的隔离级别
(2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
(3)在这个级别,可能导致大量的超时现象和锁竞争

#首先修改隔离界别set tx_isolation='serializable';
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+#事务A:开启一个新事务
start transaction;#事务B:在A没有commit之前,这个交叉事务是不能更改数据的
start transaction;
insert tx values('4','4'); ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction update tx set num=10 where id=1; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction


参考文章

Mysql事务隔离级别详解

转载于:https://www.cnblogs.com/wangfengzhu/p/9208543.html

MySQL 事物的4种隔离级别相关推荐

  1. MySQL(六)事物(ADID,四种隔离级别)(七)索引(索引测试,原则)

    6-事物 文章目录 6-事物 1,执行事物 2,模拟事务 3,事务的四种隔离级别 7-索引 7.1, 索引的分类 7.2,测试索引 插入100万数据 测试查询耗时 7.3,索引原则 事务原则:ACID ...

  2. Mysql 8的四种隔离级别以及对应不同类型的锁

    文章目录 1. MySql 8的四个隔离级别 2. 不同类型的锁 3. 四个级别 对应的不同的锁 4. 如何测试每个隔离级别使用的什么锁? 5. 有关事务相关的文档内容总结 6. 什么情况下是行锁,什 ...

  3. MySQL数据库的四种隔离级别

    一.首先介绍几个概念: 1,脏读: 又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改但是还未提交,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改并提交,这就导致了T2所读取到的 ...

  4. MySQL事务的四种隔离级别,mysql中的不可重复读和幻读的区别,Repeatable read可重复读隔离级别下怎么不存在幻读问题?

    1. 事务的隔离级别 1.1 read uncommited:读未提交.一个事务读到了另一个事务未提交的脏数据,称之为脏读. 1.2 read commited:读已提交.解决了脏读问题,但当前事务两 ...

  5. 数据库(Mysql)的四种隔离级别

    数据库事务的隔离级别有4种,由低到高分别为Read uncommitted .Read committed .Repeatable read .Serializable .而且,在事务的并发操作中可能 ...

  6. MySQL常见的四种隔离级别!

    目录 1.什么是事务 2.事务的 ACID 3.Mysql的四种隔离级别 4.测试Mysql的隔离级别 1.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所 ...

  7. MySQL事务的4种隔离级别

    文章目录 1 简介 2 什么是数据库事务? 2.1 事务的四大特性(ACID) 3 并发事务会导致的问题 3.1 本文会使用到的 SQL 语句: 3.1.1 示例表结构 3.1.2 查询事务的默认隔离 ...

  8. mysql四种隔离级别知乎_详解MySQL事务的四大特性和隔离级别

    1.事务的四大特性(ACID) 1.1.原子性(Atomicity) 原子性是指事务包含的一系列操作要么全部成功,要么全部回滚,不存在部分成功或者部分回滚,是一个不可分割的操作整体. 1.2.一致性( ...

  9. Mysql学习总结(58)——深入理解Mysql的四种隔离级别

    一.前言 开发工作中我们会使用到事务,那你们知道事务又分哪几种吗?MYSQL标准定义了4类隔离级别,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低的隔离级一般支持更高的并发处理,并拥有更低的系 ...

最新文章

  1. Java内部类手机专卖店_JAVA——内部类的那些事儿
  2. 数据蒋堂 | 多维分析预汇总的功能盲区
  3. MongoDB操作命令
  4. Qt 5.12 LTS(长期维护版本)中Qt Quick的性能改进
  5. C++ 私有成员变量的理解
  6. 值计算公式_板式换热器选型,K值是关键点!
  7. 《统计学习方法》—— 感知机对偶算法、推导以及python3代码实现(二)
  8. Linux-LNMP(pool,php-fpm慢执行日志,进程管理,open_basedir)
  9. 智维专业工程师告诉你,哪款Kvaser多通道CAN总线分析仪性价比最高?
  10. D盘需要管理员权限解决办法
  11. Inkscape基础制图教程
  12. 基于JAVA项目任务跟踪系统计算机毕业设计源码+数据库+lw文档+系统+部署
  13. IP-guard V4 服务器迁移方法
  14. 在云服务器搭建vulhub靶场
  15. linux中查看隐藏文件夹_如何在Linux中隐藏图像中的文件或文件夹
  16. C51单片机实验——LCD 1602液晶显示器
  17. Matlab生成sinc信号
  18. 能独步天下吗?揭开至强E5处理器的最后面纱
  19. Python鸟巢0926
  20. 项目管理之工作分解结构(WBS)

热门文章

  1. numpy.argmax/argmin/max/min
  2. 信息安全完全参考手册之安全策略、标准、流程和指南(第五章)
  3. 一图流“系列——Ruby vSphere Console命令脑图
  4. CVE-2020-16875:Microsoft Exchange RCE复现
  5. Docker学习总结(56)——Docker-compose 基础知识温习
  6. Linux学习总结(70)——Bash 脚本中常用的内置变量汇总
  7. 敏捷开发系列学习总结(15)——Spotify敏捷模式详解三部曲第三篇:工程文化
  8. Windows学习总结(19)——Windows必备神器Cmder使用教程
  9. Java基础学习总结(97)——合格的Java的架构师需要具备的技术知识
  10. Java Web学习总结(9)——servlet和Jsp生命周期解读