在操作一个表数据时,会自动加上 MDL读锁,在变更表结构或者删除表时,会自动加上 MDL写锁
页级锁
只有RDB引擎才支持页级锁
锁定粒度介于行级锁和表级锁中间的一种锁。...,由于事务级别为重复读,理应Q3,Q5数据都一样,在Q1中,应该会查出b=6的数据并锁住,但是Q2的中,id为1的数据2,并不涉及锁,同时Q3是新增一条数据,无法锁住
行锁只能根据索引锁住存在的数据,如果数据不存在时...,将无法锁住,就会导致出现在可重复读时却出现幻读的情况,所以mysql引入了间隙锁
间隙锁如何解决幻读
在插入数据时,mysql额外增加了间隙锁的概念,在插入表数据后,会生成 "前开后闭"的间隙区间:...-∞,2 2,6 6,9 9,∞
当给b=6加锁时,其实是给2,6和6,9 间隙加锁,保证此2个间隙不会数据不会被删除,增加数据导致数据不一致
主键条件或者唯一索引下:
如果通过不存在的主键索引加锁...如果在不存在的索引中加锁,将会在此索引间隙中加锁
行锁
行锁是在索引记录上的锁,当表中没有索引时,innodb会自动创建个隐藏主键索引用于做行锁.