锁
...大约 1 分钟
锁
锁的主要分类
全局锁:主要用于全库逻辑备份
表锁
- 普通表锁
- MDL(元数据锁):不需要显示使用,数据库会自动加锁,对一个表做增删 改查操作时会加MDL读锁,对表做结构变更操作时,加MDL写锁
行锁 :相比于表锁开销大,加锁慢,可能会发生死锁,表锁不会死锁
- 行记录锁:当查询没有索引时,会走全表,把查到的每一行都加锁,在读提交下,加锁的语句执行完成后,就会直接释放掉不符合要求的行锁。因此,如果一条更新语句没有走索引,会花费极大的开销
- 间隙锁:锁住两个行之间的数据,不允许其他事务向中间写入新数据
- NK锁(mysql默认加的锁):加锁后无论主键索引还是二级索引都会加上间隙锁
- 插入意向锁:只有在插入的时候会使用,和间隙锁冲突,但彼此不冲突
加锁的时机是什么,什么时候释放锁?
遵循两阶段协议,在语句执行开始时加锁,事务提交结束后释放
锁加在哪?
一般加在主键索引上,如果没有主键索引则加到row_id上