innodb 隔离等级
前一段时间参加了一个国内知名公司的面试,被问及对数据库的了解,自感还不错,可谁知在隔离等级这种基本概念的点翻个船,也不是因为完全不懂,而是本来这里就比较晦涩,加之具体上次看这里的东西时候已经过了一年多,中间一直在做索引相关优化的工作,所以关于隔离等级的概念点的记忆很模糊,导致了面试时候的啪啪打脸,索性最后安全线度过,现在想来,确实有点发挥失常。在这里也劝解大家,有时间跟臭味相同的技术员们聊聊天,面面试,不断回顾一些理论上的知识,而不要一味扎在业务里不出来。毕竟,大家都是要成为一名优秀的程序员啊~。啰嗦的话说到这里,下面进入主题
都知道 innodb 引擎是支持事务这一特性的,因为要介绍事务隔离等级,所以简单回顾一下事务的特性 ACID
- A:Atomicity,原子性,指事务的操作要么全部成功,要么全部失败
- C:Consistency,一致性,指事务的前后的条件必须保持一致的
- I:Isolation:隔离性,两个事务之间确保不相互影响,具有完全隔离特性
- D:Durability:持久性,事务一旦提交,不会发生丢失回退的现象
接下来我们介绍一下具体是根据什么因素去区分 4 种隔离等级的
1,未提交读(Read uncommited),会产生赃读,会读到另一个事务未提交的数据
start A | start B
select * from test; -> 1,2,3 | -
- | insert into test xx values(4)
select * from test; -> 1,2,3,4 | -
这里看到在事务 B 还未提交的情况下,事务 A 已经可以读到新的数据,违反了事务的隔离性、一致性,这种等级一般在业务场景中很少应用,因为完全没有事务可言
2,已提交读(Read commited),会产生不可重复读,会在同一个事务中读到另一个事务提交的数据
start A | start B
select * from test; -> 1,2,3 | -
- | insert into test xx values(4)
select * from test; -> 1,2,3 | -
- | commit
select * from test; -> 1,2,3,4 | -
可以看到 A 事务并没结束,但由于 B 事务已经提交,这边已经可以读到插入的数据,虽然违反了事务的一致性,但相对而言,已经达到很多业务场景的需要,所以现在很多数据库都是采用这个等级
3,可重复读(Repeatable read),会产生幻读,会在同一个事务中读到数据后,进行修改但发现数据已经被修改,这个等级也是 innodb 的默认等级。
start A | start B
select * from test; -> 1,2,3 | -
- | insert into test xx values(4)
select * from test; -> 1,2,3 | -
- | commit
select * from test; -> 1,2,3 | -
insert into test xx values(4) 此处报主键重复错误 | -
这里看到事务 A 在整个期间,所看到表中的数据没有发生任何改动,但再最后插入的时候却报了主键重复的错误,原因是因为事务 B 已经成功插入,这就是幻读想想,明明没有,但却提示我有。这样说来的话也会存在很多问题,但在实际应用场景中,只要使用得当,就可以利用 key-next lock 在第三等级完美实现事务特性,此处先不啰嗦了,大家只有知道这个等级,已经可以确保 mysql 在高并发下悠闲的使用了。
4,串行读(Serializable),无任何问题,隔离等级这一次已经完全实现了事务特性,但代价是所有的读写需要获取表级的共享锁、排它锁。无法进行事务之间的并发就注定了这种等级是食之无味的鸡肋了(当然一些安全等级极高的业务场景也是有可能用到的)
最后给出一张图总结以上(很多人开始给出图,我个人觉得浮躁的人懒得看,不浮躁的人看不懂,所以诸位不浮躁的人,恭喜你们看到这里了)
隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
===========================================================================================
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能
innodb 隔离等级的更多相关文章
- MySQL中的锁、隔离等级和读场景
一.导言 关于MySQL中的锁还有隔离等级这类话题,其概念性的解释早已泛滥.记住其概念,算不上什么.更重要的是思考:他们的区别和联系在哪儿,为什么会有这样的概念. 1)MySQL的锁(Lock)分为行 ...
- 对于MySQL数据库四种隔离等级
对于MySQL事务有四种隔离级别,分别是以下四种: 1.读未提交 2.读提交 3.可重复读 4.串行化(加锁) 对于隔离我们都是说在并发的情况下发生的事情,读取的数据在并发的情况下会发生什么情况. 并 ...
- SpringBoot设置事务隔离等级
"If you're gonna play the game, boy, ya gotta learn to play it right" Spring Boot 使用事务非常简单 ...
- Spring事务传播、隔离等级
事务传播 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见的选择. PROPAGATION_SUPPORTS 支持当前事 ...
- SpringBoot事务隔离等级和传播行为
一.开启事物管理 //import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBoo ...
- Spring系列之事务的控制 注解实现+xml实现+事务的隔离等级
Spring系列之事务的控制 注解实现+xml实现 在前面我写过一篇关于事务的文章,大家可以先去看看那一篇再看这一篇,学习起来会更加得心应手 链接:https://blog.csdn.net/pjh8 ...
- Java事务解析(事务的基本操作+隔离的等级+事务的四大特性+事务的概念)
Java事务解析(事务的基本操作+隔离的等级+事务的四大特性+事务的概念) 什么是事务? 如果一个包含多个步骤的业务操作,这些操作被事务管理,那么这些操作要么同时成功要么同时失败 事务的四大特性(必须 ...
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...
- MySQL锁和事务(一):InnoDB锁(MySQL 官方文档粗翻)
// 写在前面,实际上,数据库加锁的类型和范围受到多种因素的影响,例如数据库隔离等级,SQL语句,是否使用主键.索引等等.可以查看博文: http://www.cnblogs.com/zhaoyl/p ...
随机推荐
- linux程序编译过程
大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ...
- ak-1
最近研究ak,网上也有很多这方面的资料,就不重复叙述了,本次记录就是自己在做适应时的一些记录. 本次环境 中标麒麟 金蝶apusic 人大金仓 先说说东西从哪下载怎么来的 基本都是通过官网打电话申请 ...
- NMI是什么
NMI是什么 2016/02/28 vmunix NMI(non-maskable interrupt),就是不可屏蔽的中断.根据Intel的Software Developer手册Volume 3, ...
- Hosts 文件切换工具
建议删除无用的注释,否则在启用全部的时候会把注释和说明内容的注释取消掉 下载地址:
- 洛谷-P3796-AC自动机加强版
链接: https://www.luogu.org/problem/P3796 题意: 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本 ...
- PHP mysqli_field_tell() 函数
mysqli_field_tell() 函数返回字段指针的位置. 取得所有字段的字段信息,然后通过 mysqli_field_tell() 取得当前字段并输出字段名称.表格和最大长度: <?ph ...
- 011_linuxC++之_继承的引入
(一)面向对象程序设计中最重要的一个概念是继承.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易.这样做,也达到了重用代码功能和提高执行时间的效果. (二)引入继承程序 # ...
- table表格合并列中相同的内容
方法一: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- 终于结束的起点——Adios
准退役了一年,终于还是要结束了,整个高中的OI生涯就这么过去了. 今年的CSP-S又一次提醒我,我真的只是个蒟蒻,学了两年多还是这么个样.不过,这段OI生涯或许确实给我带来了许多. 一切的起点 17年 ...
- bbs项目---表关系
表关系 用户表个人博客表点赞表文章表文章描述表文章和标签多对多关系表评论表分类表标签表 表关系设计示例收集: 1 https://bbs.csdn.net/topics/390260474 2 上图博 ...