MVCC是为了方便并发修改数据库的时候。防止互相影响的一个重大发明
MVCC主要用于 读已提交、可重复读这两个事务隔离级别
MVCC搭配使用的还有READ VIEW
RR级别有幻读的风险,主要是出现在快照读和当前读混合使用的情况
RR级别InnoDB通过临键锁解决幻读问题主要是体现在 for update
RR级别如果默认使用快照读,是不会存在脏读问题的
当前读 for update 带来的问题
锁表
插入 锁全表
更新
id | c | d |
---|---|---|
0 | 0 | 0 |
5 | 5 | 5 |
10 | 10 | 10 |
15 | 15 | 15 |
命中索引,范围方向至最近一个记录记录,且包含
例子:
select * from t where id < 4 就会把(-∞,5]的记录锁住 注意涉及锁住记录的要从索引所在的列维度来判断
小于最小记录(-∞ ,最小记录]
如果大于最后一条记录,则[指定值主键,+∞ )
涉及索引 当没命中。相邻的两个记录之间形成间隙锁,端点两条记录均不受锁影响,
如果大于最后一条记录,则[指定值主键,+∞ )小于最小记录(-∞ ,最小记录] 命中只会加行锁,锁住命中那一行数据
不涉及主键,直接锁表
所以用forUpdate有风险