MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见
简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务至此是在引擎层实现的,但并不是所有的MySQL引擎都支持事务,这也是MyISAM被InnoDB取代的原因之一。
隔离性与隔离级别
提到事务,想到的是ACID(原子性,一致性,隔离性,持久性)
原子性:原子性操作就是这个事物执行要么成功,要么失败。将整个过程看作是一个不可分割的整体。
一致性:一致性指的是一个事务在执行前后其状态一致。比如你和小明各有100元,无论你俩之间相互借还多少钱加起来都是200.这就是事务的一致性。
持久性:对于事务来讲,事务一旦提交他对数据库所做的改变是永久的,即使数据库故障也不会产生干扰。
隔离性。
当数据库上有多个事务同时执行的时候,就可能出现脏读、不可重复读、幻读的问题,为了解决这些问题,就有了事务的隔离级别的概念。
- 脏读:事务 A 读取了事务 B 更新后的数据,但是事务 B 没有提交,然后事务 B 执行回滚操作,那么事务 A 读到的数据就是脏数据
- 不可重复读::事务 A 进行多次读取操作,事务 B 在事务 A 多次读取的过程中执行更新操作并提交,提交后事务 A 读到的数据不一致。
- 幻读:事务 A 将数据库中所有学生的成绩由 A -> B,此时事务 B 手动插入了一条成绩为 A 的记录,在事务 A 更改完毕后,发现还有一条记录没有修改,那么这种情况就叫做出现了幻读。
在说隔离级别之前你首先要知道,隔离的越狠,效率就越低。
SQL标准的事务隔离级别包括
- 读未提交(read uncommitted)
- 读提交( read commited)
- 可重复读(repeatable read)
- 串行化(Serializable)
- 读未提交是指,一个事务还没提交时,他做的变更就能被别的事务看到。
- 读提交是指:一个事务提交之后,他做的变更才会被其他事物看到。
- 可重复读:一个事务执行过程中看到的数据总是跟这个事务启动时看到的数据是一致的,当然在这种隔离级别下,未提交的事务是不可见的。
- 串行化:顾名思义就是同一行记录,写的时候加锁,读也会加锁,当出现读写锁冲突时,后访问的事务必须等前一个事务执行完毕,才能继续执行。
隔离级别由小到大:读未提交<读已提交<可重复读<串行化

- 如果隔离级别是“读未提交” ,则V1的值是2,这时候事务B虽然没有提交但是结果已经被A看到了。因此V2和V3都是2.
- 若隔离级别是“读提交”则V1是1,V2和V3是2.
- 若隔离级别是“可重复读”则V1,V2是1,V3是2。因为可重复读要求就是事务在执行期间看到的数据前后必须是一致的。
- 若隔离级别是“串行化”,则在事务B执行“将1改成2”的时候,会被锁住。直到事务A提交后,事务B才可以继续执行。所以A的角度看,V1,V2是1,V3是2.
在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”隔离级别下。这个视图是在事务启动时才创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个SQL语句开始执行的时候创建的。“读未提交”下直接返回记录上的新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。
事务隔离级别各自能解决的问题是
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | 允许 | 允许 | 允许 |
| 读已提交 | 不允许 | 允许 | 允许 |
| 可重复读 | 不允许 | 不允许 | 允许 |
| 串行化 | 不允许 | 不允许 | 不允许 |
MySQL的默认隔离级别是repeatable-read(可重复读), Oracle数据库的默认隔离级别是“读已提交”,因此对于一些从Oracle迁移搭配MySQL的应用,为保证数据库隔离级别的一致,你一定记得将MySQL的隔离级别设置为“读未提交”。
配置的参数就是将
transaction-isolation的值设置成READ-COMMITED
show variable 来查看当前的值
事务隔离的实现
在MySQL中实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。
例如将num从1改成2,再从2改成3过程中。mysql会保存这几个回滚段,将2改回1,将3改回2. read-viewA,read-viewB.
回滚日志什么时候删除?
再不需要的时候才删除,系统会自动判定当没有事务在需要使用这些回滚日志时,回滚日志会被删除。
在MySQL5.5及以前版本,回滚日志是和数据字典在一起放在ibdata文件里的,即使尝试无最终提交,回滚段被清理,文件也不会变小。长事务除了会堆积大量事务视图占据系统资源,他还占用锁资源,也可能拖垮整个库。
事务的启动方式
- 显示启动事务语句,begin / start transaction。配套的提交是commit,回滚是rollback。
- set autocommit=0,这个命令会将这个线程的自动提交关闭掉。意味着如果你只执行一个select语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行commit或rollback,或者断开连接。
一般建议使用set autocomiit =1,通过显示语句的方式来启动事务。
commit work and chain,这是提交事务并自动启动下一个事务,这样省去了begin语句的开销。同时带来的好处是从程序开发的角度明确知道每个语句是否处于事务中。
MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见的更多相关文章
- MySQL 笔记整理(3) --事务隔离,为什么你改了我还看不见?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 3) --事务隔离,为什么你改了我还看不见? 简单来说,事务就是要保证一组数据操作,要么全部成功,要么全部失败.在MySQL中,事务 ...
- mysql实战45讲 (三) 事务隔离:为什么你改了我还看不见 极客时间读书笔记
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱. 转账过程具体到程序里会有一系列的操作,比如查询余额 ...
- (转)SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
六.各种事务隔离级别发生的影响 修改数据的用户会影响同时读取或修改相同数据的其他用户.即这些用户可以并发访问数据.如果数据存储系统没有并发控制,则用户可能会看到以下负面影响: · 未提交的依赖关系(脏 ...
- SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
六.各种事务隔离级别发生的影响 修改数据的用户会影响同时读取或修改相同数据的其他用户.即这些用户可以并发访问数据.如果数据存储系统没有并发控制,则用户可能会看到以下负面影响: · 未提交的依赖关系(脏 ...
- mysql四种事务隔离级别
mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...
- 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- mysql锁及四种事务隔离级别笔记
前言 数据库是一个共享资源,为了充分利用数据库资源,发挥数据 库共享资源的特点,应该允许多个用户并行地存取数据库.但这样就会产生多个用户程序并 发存取同一数据的情况,为了避免破坏一致性,所以必须提供并 ...
- MySQL实战 | 03 - 谁动了我的数据:浅析MySQL的事务隔离级别
原文链接:这一次,带你搞清楚MySQL的事务隔离级别! 使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity).一致性(Consistency ...
- 啥是 MySQL 事务隔离级别?
之前发过一篇文章,简单了解 MySQL 中相关的锁,里面提到了,如果我们使用的 MySQL 存储引擎为 InnoDB ,并且其事务隔离级别是 RR 可重复读的话,是可以避免幻读的. 但是没想到,都 1 ...
随机推荐
- do{}while(false)的用法
do{}while(false): 在工作中我们能经常发现有人写 do{}while(false) 这样的代码,初看时让人迷惑不解,按照上面的语法 do{}while(false) 这样 do{} ...
- Excel优雅导出
流程 原来写过一篇文章,是介绍EasyExcel的,但是现在有些业务需要解决,流程如下 1.需要把导出条件转换成中文并存入数据库 2.需要分页导出 3.需要上传FTP或者以后上传OSS 解决方案 大体 ...
- maven中引入jstl
<!--jsp标签--> <dependency> <groupId>taglibs</groupId> <artifactId>stand ...
- java-02-基础语法
1.分支语句 if语句 格式 if(关系表达式1){语句1} else if(关系表达式2){语句2} else{语句3}; 说明 如果关系表达式1的值为true,执行语句1. 如果关系表达式2的值为 ...
- Eureka系列(四) 获取服务Server端具体实现
获取服务 Server端流程 我们先看下面这张图片,这张图片简单描述了下我们EurekaClient在调用EurekaServer 提供的获取服务Http接口,Server端实现接口执行的大致流程 ...
- 啊!Java虚方法
什么是Java的虚方法呢,我们首先看看什么是虚函数 虚函数 百度百科的解释为: 在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的[成员函数],用法格式为:virtual 函数返回 ...
- Java之String重点解析
String s = new String("abc")这段代码创建了几个对象呢?s=="abc"这个判断的结果是什么?s.substring(0,2).int ...
- Gradle AndroidStudio内网离线构建配置踩坑记录
最近一家新公司,由于办公环境都是在内网机上,导致在Unity导出android工程后,gradle离线构建也是第一次搞,花了一天时间也踩了一些坑,最后也终于构建成功了,这里记录下,方便大家少走些弯路. ...
- 推荐系统实践 0x12 什么是Embedding
做过深度学习的小伙伴,大家应该多多少少都听说过Embedding,这么火的Embedding到底是什么呢?这篇文章就用来介绍Embedding.另外,基于深度学习的推荐系统方法或者论文还没有结束,我打 ...
- 爬取并分析一下B站的最热视频排行榜,看看大家都喜欢看什么视频
前言 现在大家的生活中,已经越来越离不开B站了,2020年的第一季度,B站月活跃用户达到了1.72亿,日活跃用户也已经突破了5000万个用户.源源不断的流量让B站的up主们也是粉丝数目不断暴涨,百万粉 ...