如果二级索引记录被标记为删除 , 或者二级索引页被新的事务更新 , 覆盖索引记录就不会被使用 。 InnoDB不会从索引结构里返回值 , 而是会从聚簇索引里查找记录
MVCC和幻读幻读 , 同一个事务里连续执行两次同样的SQL , 可能导致不同结果的问题 。 第二次sql语句可能会返回之前不存在的行 。
- 在快照读情况下 , 通过mvcc来避免幻读
mvcc利用历史版本信息(快照)来控制它能读取的数据范围
- 在当前读情况下 , 通过next-key锁来避免幻读
- 快照读
简单的select操作
Read Committed: 每次select都生成一个快照读
Repeatable read: 开启事务后第一个select语句才是快照读的地方 , 而不是一开启事务就快照读
- 当前读
读取最新版本的记录(即使别的事务提交的数据也能查询到) , 并且对读取的记录加锁 , 阻塞其他事务同时改动相同记录 , 避免出现安全问题 。
会让insert\\update\\delete阻塞
select ... for update
insert
update
delete
在RR级别:
- 快照读通过MVCC和undo log来实现
- 当前读通过加record lock(记录锁)和gap lock(间隙锁)来实现
- 事务的原子性是通过undo log来实现的
- 事务的持久性是通过redo log来实现的
- 事务的隔离性是通过(读写锁+MVCC)来实现的
- 事务的一致性 , 是通过原子性、持久性、隔离性来实现的
类型
- STATEMENT 日志记录基于语句
- ROW 日志记录基于行 。 默认方式
- MIXED 日志记录使用混合格式(默认基于语句 , 特定情况下切换到基于行)
- 数据库默认隔离级别
mysql-可重复读; oracle PostgreSQL-读已提交
- 为什么mysql用可重复读(RR)而不是读已提交(RC)
5.0之前只有statement一种格式 , 主从复制会存在大量的不一致 , 故选用RR
- 【InnoDB|带你认识什么是MySQL的内存架构和索引说明】为什么默认隔离级别很多选用RC
-- 可重复读RR存在间隙锁 , 会使死锁的概率增大;在可重复读下 , 条件列未命中索引会锁表;在读已提交RC下 , 只锁行
-- 在读已提交RC下 , 引入半一致读(semi-consistent)特性增加了update操作的并发性能
-- 不可重复读在开发中是可以接受的
- 微信|遇到不认识的字,用微信1秒就能读出来,操作简单,比字典还方便
- 诈骗|女子遇诈骗反赚骗子1千多 认识炒股专家被坑惨:官方提醒不要想暴富
- 黑科技与建筑的无缝结合,带你回溯千年历史
- 微信|带你了解微信新版本的几个实用功能
- 对于知网论文查重系统带你们来深刻探索一下!
- 本文转自:新华网第十届中国(绵阳)科技城国际科技博览会于11月16日至19日在四川绵阳举...|记者带你体验科博会上的“新”“奇”“特”
- 欧盟|苹果手中的“灰色”出货神器,带你了解卡贴机黑解背后的底层逻辑
- 华硕|11月17日登场!一文带你提前看完我10系列亮点,屏幕太绝
- “智慧水电”应用上线啦!一篇文章带你一探究竟…
- 显示器|无愧经典,从不落伍的CD机带你重拾听音的纯粹