『MySQL』跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现
提到MySQL的事务 , 我相信对MySQL有了解的同学都能聊上几句 , 无论是面试求职 , 还是日常开发 , MySQL的事务都跟我们息息相关 。
而事务的ACID(即原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)可以说涵盖了事务的全部知识点 , 所以 , 我们不仅要知道ACID是什么 , 还要了解ACID背后的实现 , 只有这样 , 无论在日常开发还是面试求职 , 都能无往而不利 。
为了大家更好的阅读体验 , 对ACID的深入分析将分为上下两篇 。
本篇为上篇 , 主要围绕ACID中的I,也就是“隔离性”展开 , 从基本概念 , 到隔离性的实现 , 最后以一个实战案例进行融会贯通 。
嗯 , 看完你都能理解 , 那跟面试官侃半小时隔离性就没问题了 。
1.事务隔离性的基本概念 1.1 什么是ACID中的Isolation,隔离性 Isolation,隔离性 , 也有人称之为并发控制(concurrency control) 。 事务的隔离性要求每个事务读写的对象对其他事务都是相互隔离的 , 也就是这个事务提交前 , 这个事务的修改内容对其他事务都是不可见的 。 事务的隔离性 , 主要是解决不同事物之间的相互读写影响 。
所谓的读写影响注意分为三种:
- 脏读:读到了别的事务尚未提交(commit)的变更 , 别人没提交 , 我读到了 。
- 不可重复读:别的事务提交了变更 , 被当前事务读到了 。 然后导致本事务多次select的结果不一样 , 读到了别的事务提交的内容 。
- 幻读:也是读到了别的事务提交的内容 , 但是跟上面的不同之处在于 , 读到了原本不存在的记录 。
1.2 隔离性的隔离级别 为了解决事务隔离性的问题 , 数据库一般会有不同的隔离级别来解决相应的读写影响 。
- 读未提交:一个事务B还没提交 , 它的修改就被别的事务A读到了 。
- 读已提交:一个事务B提交后 , 它的修改被其他事务A看到了 。
- 可重复读:一个事物B提交前和提交后 , 事务A都无法读到事务B的变更 。
- 串行化:对同一行记录 , 当出现不同事物的读写冲突时 , 是通过串行化的方式解决的 , 后一个事务必须等前一个事务完成才能执行 。
本文插图
需要注意的是 , 这是标准事务隔离级别的定义 。 在MySQL的innodb引擎中 , 在可重复读级别下 , 通过mvcc解决了幻读的问题 , 具体实现我们后面再讲 。
同时 , 需要注意的是 , 到目前为止 , 我们说的读 , 都是”快照读” , 普通的select 。 后面我们还会提到“当前读” , 是不一样的哦 。
2.事务隔离性的实现 要实现事务的隔离性 , 需要了解两个方面的内容 , 一个是锁 , 一个是多版本并发控制(MVCC) 。
2.1 事务的行锁 InnoDB中 , 实现了两种标准的行级锁:
- 共享锁(S Lock) , 也叫读锁 , 允许事务读取一行数据 。
- 排它锁(X Lock) , 也叫写锁 , 允许事务删除或者更新一行数据(注意 , 这里没有提到插入哦 , 插入涉及到幻读 , 可以看文章最后的说明)
- Select … lock in share mode语句能够获得共享锁
- Select … for update(特殊的select , 用mysql简单实现分布式锁经常用它)、Update、delete语句能够获得排它锁
推荐阅读
- 霍格沃兹测试学院:内推 | 跳槽吗?可年前面试,年后入职的那种
- 「大咖说生活」你会怎么做?女子淡定回答被录取,面试官:看到男女同事抱在一起
- 「月影说职场」中专生答对被录用,面试官:1+1等于多少?4个大学生应聘失败
- 『数据库』4月数据库流行度排行:MySQL 成事实王者,国产openGauss引期待
- [面试]国培教育—2020江西公务员面试热点:生态菜“种”出致富路
- 【怪咖搞笑】幽默笑话:昨天去公司面试 碰到个美女面试官,原创
- 『怪咖搞笑』碰到个美女面试官,幽默笑话:昨天去公司面试
- 【鱼堂主爱思考】在办公室发现我牙齿上有菜叶,该怎么提醒才可以被录用,面试官问
- 【面试】Google 教你视频面试
- 『姵来晓晓看娱乐』并存入mysql数据库,超详细,python3快速爬取房源信息
