Mysql幻读
知识点:
1.幻读一般发生在可重复读级别。
2.幻读的解决办法,可通过可重复读级别下第一次读,使用
select * from … for update. 或者for read 可以加间隙写锁或者读锁。
3.间隙锁可看https://www.jianshu.com/p/bf862c37c4c9,(注意如果锁住的字段是唯一索引和主键,会变成行锁,除非是范围查询和锁住的行不存在,会生成间隙锁) 或者字段索引是普通索引也会生成间隙锁。
事务1:
事务2
可看到事务2阻塞了,说明产生了间隙锁。
事务3
可见间隙是针对主键间隙。
CREATE TABLE user
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
varchar(255) DEFAULT NULL,
age
int(11) DEFAULT NULL,
PRIMARY KEY (id
),
KEY index_name
(age
)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
4.注意加锁的字段没有索引时,锁会升级为表锁。