四种隔离级别概述

1.未提交读(read-uncommitted)

在一个事务中,可以读取到其他事务未提交的数据变化,这种读取其他会话还没提交的事务,叫做脏读现象,在生产环境中切勿使用。

2.已提交读(read-committed)

在一个事务中,可以读取到其他事务已经提交的数据变化,这种读取也就叫做不可重复读,因为两次同样的查询可能会得到不一样的结果。

3.可重复读(repetable-read)

MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。

4.可串行化(serializable)

这是最高的隔离级别,它强制事务串行执行,避免了前面说的幻读现象,简单来说,它会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用问题。

上边的叙述,我想很多人都很熟悉,但是针对叙述中所说的查询,大家是否有一个清晰的认识呢?是select还是select 。。。for update?还是都可以?

或者换种问法,针对3.可重复读的叙述(在事务结束前,查询看到的数据是不会变化的)是如何查询?是普通的select...还是select...for update,还是都可以?

带着这个问题,我们做一下分析。

需要懂的概念

  • 当前读:

  select...lock in share mode (共享读锁)
  select...for update
  update , delete , insert

  当前读, 读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题

  例如,假设要update一条记录,但是另一个事务已经delete这条数据并且commit了,如果不加锁就会产生冲突。所以update的时候肯定要是当前读,得到最新的信息并且锁定相应的记录。

  • 快照读

  单纯的select操作,不包括上述 select ... lock in share mode, select ... for update。    

  Read Committed隔离级别:每次select都生成一个快照读。

  Read Repeatable隔离级别:开启事务后第一个select语句才是快照读的地方,而不是一开启事务就快照读。

以上定义引用文章:https://www.cnblogs.com/wwcom123/p/10727194.html。如果想理解实现原理可以点进去看一下。

分析

通过上边的介绍,我们猜想,可重复读叙述中的查询,应该是针对快照读来说的。而不是当前读。

针对这个结论我们可以测试一下。

测试

打开Navicat,右键数据库运行两个sql命令行。

输入以下命令,查看当前事务级别,如果要是查询全局的就加上global.。

#mysql8以下版本
select @@global.tx_isolation;
#mysql8以上版本
select @@global.transaction_isolation

一般默认是REPEATABLE-READ可重复读。

那就先测试可重复读。

首先将在两个窗口中,设置自动提交false。通过命令查看当前的自动提交状态。

show variables like 'autocommit';

默认是开启的,就是自动提交事务。

通过以下命令来设置为false。

set autocommit=0;

在两个窗口都修改为自动提交false后。开始测试,设两个窗口分别为A和B。他们共同操作t_deviceinfo表

同时开启A\B的事务。

begin;

首先让A修改t_deviceinfo表id为107的DeviceName值。

update t_deviceinfo set DeviceName='111' where ID=107;

然后让B查看这个id的值,看是否改变。按照概述中第3点,是不会改变的,

在B中执行查看语句,使用快照读方式,

select * from t_deviceinfo where ID=107;

结果发现确实没有改变。

那继续在B中执行查看语句,使用当前读方式。

select * from t_deviceinfo where ID=107 for update;

点击回车后,发现程序处于等待。这是因为获取锁处于阻塞,需要等到锁释放才能查询,那么我们就将A commit来释放锁。

commit;

然后B再执行当前读。发现查询结果是A修改后的结果。

在B中再执行快照度,发现查询结果是没有变化,还是A修改前的结果,满足概述中第3条的理论。

这样看来。概述中说的查询是使用快照读,这块我们要有清晰的认识。

接下来看下读已提交是不是这样。

通过以下命令来修改隔离级别。

set session transaction isolation level read committed;

同样执行上边的操作,发现结论是一样的。

总结

通过上边的分析,我们知道,select for update 方式,不论在哪种隔离级别都会获取到最新的数据。而select的方式,是根据事务隔离级别的不同,查询结果也是不一样的。

为什么会不一样呢?是因为在不同的事务级别,快照读的生成时机是不一样的:

  • Read Committed隔离级别:每次select都生成一个快照读

  • Read Repeatable隔离级别:开启事务后第一个select语句才是快照读的地方,而不是一开启事务就快照读。

mysql事务隔离级别的研究相关推荐

  1. mysql事务四个安全级别_四个MySQL事务隔离级别的详细说明

    本文中的实验测试环境: Windows 10 + cmd + MySQL5.6.36 + InnoDB 首先,交易的基本要素(ACID) 1. 原子性: 事务开始后 2. 一致性(Consistenc ...

  2. MySQL事务隔离级别的实现原理

    回顾 在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别. 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏读.幻读.不可 ...

  3. MySQL事务隔离级别是怎么实现的?

    我的钱包里共有100万. 今天我心情好,我决定给你的转账 100 万,最后的结果肯定是我的余额变为 0 元,你的余额多了 100 万元,是不是想到就很开心? 转账这一动作在程序里会涉及到一系列的操作, ...

  4. MySQL数据库中默认事务隔离级别是?

    MySQL数据库中默认事务隔离级别是? 事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到 ...

  5. MySQL 是如何实现RC事务隔离级别的

    摘要:Read Committed,事务运行期间,只要别的事务修改数据并提交,即可读到人家修改的数据,所以会有不可重复读.幻读问题. 本文分享自华为云社区<MySQL RC事务隔离级别的实现&g ...

  6. mysql查看数据库事务隔离级别_MySQL查看和修改事务隔离级别的实例讲解

    查看事务隔离级别 在 MySQL 中,可以通过show variables like '%tx_isolation%'或select @@tx_isolation;语句来查看当前事务隔离级别. 查看当 ...

  7. 自语之Mysql隐式提交和事务隔离级别的关系

    前言 笔者自诩对Mysql的知识积累已经很不错了,现在看来不过是对CRUD操作比较熟悉罢了. 用了那么久的Mysql, 直到前几日才知道隐式提交和事务隔离级别的联系(内幕). (想自学习编程的小伙伴请 ...

  8. mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置

    0.准备 事务隔离级别如下: Read-Uncommitted Read-Committed Repeatable-Read Seriaizable 在xhsell开启三个会话( 注意:这里的xshe ...

  9. mysql与spring隔离级别不同_mysql事务隔离级别与spring事务隔离级别的区别

    mysql事务隔离级别与spring事务隔离级别的区别: 脏读:为什么会出现脏读,因为你对数据库的任何修改都会是立即生效的,至于别人能不能看到主要取决与你 是否加锁了,数据库的执行与事务没有关系,事务 ...

最新文章

  1. Eclipse for Tricore 的安装方法
  2. MySQL读写分离应用层解决
  3. 写毕业论文的最容易踩的几个坑
  4. 通过Fiddler进行手机抓包
  5. PFILE和SPFILE
  6. Sphinx——自动生成Python文档
  7. python socket模块 和pyqt_使用PyQt和Socket进行聊天编程[标准库]
  8. [c#] const 与 readonly
  9. 密封槽设计标准_O型密封圈标准及沟槽设计规范
  10. 简历上如何描述项目经验
  11. 一位销售的几年职业总结
  12. java实现机器人行走
  13. SpringBoot基础
  14. cityengine笔记
  15. could not delete: [org.jbpm.pvm.internal.model.ExecutionImpl#20007] 使用jbpm流程结束时出现异常
  16. 神通数据库自助在线查询
  17. MyHome3D在线装修设计软件测评
  18. 3D Human Body Reshaping with Anthropometric Modeling 阅读翻译
  19. 解决 redis 存入中文,取出来是乱码wenti
  20. 关于python中print失灵问题

热门文章

  1. 计算机屏幕暗度怎么调,电脑显示屏亮度怎么调节「图文」
  2. 云栖大会,未来万物皆是计算机?
  3. 欧几里得算法和更相减损术证明
  4. 家用台式计算机硬件配置清单,台式机组装,详细教您组装电脑高配置清单
  5. 学习前端 css day3.md
  6. 防止form表单重复提交的几种方案
  7. Android Q手势功能升级-似苹果3D Touch
  8. uniapp app端运用renderjs使用turnjs,打造电子书仿真翻书效果
  9. 如何让自己的U盘加上logo
  10. 华为荣耀android,速来围观!华为、荣耀将升级Android10名单流出,你手机在其中没...