如果二级索引记录被标记为删除 , 或者二级索引页被新的事务更新 , 覆盖索引记录就不会被使用 。 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操作的并发性能
-- 不可重复读在开发中是可以接受的
- 平时大家输入汉字时一般都习惯用拼音输入法|怎么在电脑上把不认识的字打出来
- Java|24位博主,带你了解自媒体的真相
- 华为|不同职业的人怎么选华为PC?带你对号入座
- 域名|认识松下Lumix DC-G95(G90)
- 骨传导耳机|骨传导耳机伤耳朵吗?带你一分钟了解骨传导耳机
- 华硕|双12大促来了!带你种草全新华为“书房三宝”
- 北大|北大天才少年“还俗僧人”柳智宇宣布恋情:出家时就认识她了 女方未提买房买车
- 数学|北大数学天才柳智宇还俗后宣布恋情:出家时就认识她了 符合找女友标准
- 短视频|【海归求职网CareerGlobal】13年500强企业工作经验资深行业顾问带你深入了解产品经理岗位!
- 燃气热水器|双增压零冷水,这冬天云米AI燃气热水器Super带你酣畅淋漓地洗澡
