一、事务并发引起的问题

脏读:事务A访问数据,与此同时事务B也访问了相同的数据,并且对数据进行增删改操作,但并未commit事务,此时事务A能够读取到事务B还未提交的数据。

不可重复读:事务A访问数据,与此同时事务B也访问了相同的数据,并且对数据进行“更新”操作,并且commit事务,此时事务A能够读取到事务B已提交的数据,这与事务A开始时读取到的数据不同。表现为,同一个事务内,多次读取的数据不同。

幻读:事务A访问数据,与此同时事务B也访问了相同的数据,并且对数据进行“插入”、“删除”操作,并且commit事务,此时事务A能够读取到事务B已提交的数据(select不到,但update时实际上也操作了事务B插入的数据),这与事务A开始时读取到的数据不一致。

其中,问题的程度为:脏读>不可重复读>幻读,也就是说,如果出现脏读的问题,那么不可重复读和幻读的问题也是存在的。

(如果不明白,看下面演示)

二、隔离级别及效果演示

read uncommitted(读未提交):允许事务读取其他事务未提交的操作。脏读、不可重复读、幻读都会出现。是最低的隔离级别。

read committed(读已提交):只允许事务读取其他事务已提交的操作。可以避免脏读,不可重复度、幻读仍会出现。

repeatable read(可重复读):不允许事务读取其他事务已提交的update操作,允许读取其他事务已提交的insert、delete操作。可以避免不可重复读,幻读仍会出现。换句话说,在事务A的访问期间,能够屏蔽掉事务B已提交的对行进行的update操作,但是无法屏蔽掉事务B已提交的对表进行的insert、delete操作。是mysql的默认隔离级别

serializable(串行化):不允许事务读取其他事务已提交的任何操作。所有的并发问题都可以避免,但效率低下。

各个隔离级别能处理哪些并发问题,用表格来表示:

  脏读 不可重复读 幻读
read uncommitted(读未提交) × × ×
read committed(读已提交) × ×
repeatable read(可重复读) ×
serializable(串行化)

演示

需要用到的mysql命令:

查看当前隔离级别:select @@tx_isolation;

设置当前mysql连接的隔离级别:set session transaction isolation level read committed;

关闭“自动提交事务”:set autocommit=0;

查询当前自动提交是否开启:show variables like 'autocommit';

开始事务:start transaction;

结束事务:commit(提交)/rollback(回滚)

需要注意一个问题:必须在当前的事务结束之后,才可以重新设置事务的隔离等级,否则不生效。

准备工作:

打开两个dos命令窗口,分别登陆对应的数据库,用这两个窗口来表示事务A和事务B:

mysql -u -root -p ****

use xxxdatabase

要操作的表为学生表,原始数据为:

在dos窗口查询mysql中文会乱码,用以下命令设置可解决:

set names gbk;

1、read uncommitted(读未提交)

1)事务A、事务B均设置隔离级别,关闭“自动提交事务”,开始事务;

2)事务A查询student数据,现在还是原始数据;

3)事务B更新(或者插入、删除)student表中数据,但是并未commit;

此时在事务A中查询:

事务A能够读取到事务B未commit的数据,这种现象就叫做脏读。如果这时候insert,delete操作也是一样的,此处不演示。

5)如果这个时候再对事务B进行回滚,相当于事务B已结束,事务A读取的数据也恢复了;

事务B:

事务A:

2、read committed(读已提交)

1)事务A、事务B均设置隔离级别,关闭“自动提交事务”,开始事务;

2)事务A查询student数据,现在还是原始数据;

3)事务B更新(或者插入、删除)student表中数据,还未进行commit;

此时在事务A中查询:

事务A并未受到影响,说明已经解决了脏读的问题。

4)如果对3)中事务B对的操作继续进行commit;

此时在事务A中查询:

事务A中查询到了事务B中已经commit的数据,这种现象就叫做不可重复读,事务A刚开始和结束时读取到的数据不一致。

3、repeatable read(可重复读)

1)事务A、事务B均设置隔离级别,关闭“自动提交事务”,开始事务;

2)事务A查询student数据,现在还是原始数据;

3)事务B更新(update)student表中数据,并进行commit;

此时在事务A中查询:

事务A中查询的数据未受影响,即事务A中查询不到事务B中已提交的更新操作,事务A开始和结束时读取到的数据是一致的,说明已经解决了不可重复读的问题。

4)事务B插入、删除(insert、delete)student表中数据,并进行commit;

此时在事务A中查询:

虽然只有2条数据,但是更新的时候,实际上更新的是3条数据,说明事务A中还是读取(只是不是select出来的)到了事务B中已提交的插入、删除操作,这种现象叫做幻读

此时先commit,再select就能看出来实际效果。

4、serializable(串行化)

1)事务A、事务B均设置隔离级别,关闭“自动提交事务”,开始事务;

2)事务A查询student数据,现在还是原始数据;

3)事务B插入、删除(insert、delete)student表中数据,并进行commit;

此时事务B并不允许进行任何操作,是阻塞状态,只有在事务A结束之后,才能进行操作,这就解决了幻读的问题。

事务A结束:

事务B才进行操作:

如有问题,欢迎纠正。

【mysql】隔离级别的理解及效果演示(通俗易懂,不涉及原理)相关推荐

  1. python之连接MySQL数据库的简易界面编程(连接数据库+模块搭建+界面搭建+功能完成+效果演示)

    目录 一,连接数据库 下载pymysql软件包的三种方式 方式一 方式二 方式三 新建util包和DBUtil类,完整代码如下 二,模块搭建 建立实体类book 三,界面搭建 新建main包GUI文件 ...

  2. Mysql加锁过程详解(3)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  3. mysql 做回归模型_技术分享 | 我对 MySQL 隔离级别的剖析

    隔离级别的产生 在串型执行的条件下,数据修改的顺序是固定的.可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据修改在并发执行的情况下得到一个固定.可预期的结果,由此产生 ...

  4. 唯美雪景雪花飘落代码,附效果演示

    唯美雪景雪花飘落代码, 效果演示; 包括一个index.html代码+两个js代码+图片文件夹 简单的来说不是很难,主要就是以理解为主,修改index里面的文字内容,以及图片的替换,js 的代码不需要 ...

  5. MySQL索引的理解学习,面试不问索引原理就是事务原理

    目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B+树 B+树(聚集索引) B+树(辅助索引) 思考一下为何使用B+树结构, 不是B ...

  6. MMPose姿态估计+人体关键点识别效果演示

    MMPose--开源姿态估计算法库(附人体关键点识别效果演示) 一.简介 1.1 背景 首先姿态估计属于计算机视觉领域的一个基础研究方向.MMPose是基于Pytorch的姿态估计开源算法库,功能全, ...

  7. JavaWeb实现酒店预定管理系统附代码以及使用效果演示

    题目 效果演示 完整代码下载 在线拍卖系统下载 酒店管理系统代码讲解 效果演示中有我的联系方式 基于JavaWeb的酒店预定管理系统,要求最后的项目部署在Tomcat服务器上,并实现下图所示的所有功能 ...

  8. 【Matlab 图像】边缘检测算法及效果演示

    [Matlab 图像]边缘检测算法及效果演示 边缘检测 检测图像中的边缘 Matlab 代码 代码效果如下 边缘算法:robert 边缘算法:sobel prewitt 边缘算法:laplacian ...

  9. Mysql加锁过程详解(2)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

最新文章

  1. 内网和外网的区别_无需服务器,树莓派使用内网穿透进行建站与维护
  2. 设计模式-软件架构设计七大原则及开闭原则详解
  3. 在.c文件中调用cuda函数
  4. 集合在枚举数实例化后进行了修改_(编程知识)C# 枚举与位枚举
  5. php5.5.* mysqlnd驱动安装
  6. 详述一次大量删除导致MySQL慢查的过程
  7. (09)Vivado IO约束
  8. ES面试基础知识要点
  9. 下一代Mac mini将率先搭载苹果自研M2系列芯片
  10. xtragrid 某个值 查找_二分查找(下):如何快速定位IP对应的省份地址?
  11. [Go] 通过 17 个简短代码片段,切底弄懂 channel 基础
  12. python怎么使用-如何使用python进行第一个机器学习项目(详细教程篇)
  13. linux下常见软件安装
  14. 在CentOS下面编译WizNote Qt Project
  15. 编程中的幂等性(一):http幂等性
  16. Google Earth Engine(GEE)计算雷达植被指数RVI
  17. Java毕业设计-疫情防控系统
  18. 嵌入式软件架构的设计
  19. 数学通道的应用(十四)-负PWM控制下有效值的计算
  20. request+BeautifulSoup:下载《笔趣看》网小说《第九特区》

热门文章

  1. centos7parted分区_Linux-centos7超过2TB使用parted命令分区
  2. 电子病历的基本功能——主要功能hiscookbook.电子病历的基本功能
  3. spark shell 启动 出现org.apache.spark.SparkException: Found both spark.executor.extraClassPath and SPARK
  4. 天津影视剪辑培训,这些必须的剪辑技巧你Get了吗?
  5. 短视频运营:如何提高自己的剪辑技巧?
  6. filza修改版本号_苹果iOS12修改微信提示音Filza无法下载安装怎么办?
  7. 50_00_000java,时间格式转换2020-04-09T23:00:00.000+08:00
  8. 尘埃落定!前ARM亚太区生态系统负责人Leon确认加盟大朋VR
  9. 六西格玛 Six Sigma
  10. 记录 Org 和 Markdown 的一些异同