5、锁

厨子大约 2 分钟数据库原创面试题MySQL程序厨

5.锁

5.0 MyIsam锁和InnoDB锁有什么不同?

MyIsam只支持表锁,一锁就锁住整个表,InnoDB的锁有表级锁和行级锁

5.1 全局锁和表锁

全局锁:我们通常在不支持事务的搜索引擎使用,我们使用FTWRL,但是我们需要注意的是,我们使用的时候,会让全库处于只读状态,这是非常恐怖的。

表级锁:指令 lock tables read/wirte 这是表级锁,通过锁住整个表来保证,另一种表级锁是MDL锁,不需要显示使用,他是自动实现的,读锁之间不互斥,读写之间互斥,X锁和R锁

行锁:因为行锁是在需要的时候才加上的,commit之后释放所以我们可以调整事务中,对某行的操作顺序,进而调整对操作较频繁的锁的持有时间。

间隙锁:锁住间隙

推荐阅读:https://zhuanlan.zhihu.com/p/385693319open in new window

5.2 死锁和死锁检测

对于有行锁的搜索引擎,我们就有可能出现死锁,因为其是commit之后才会事务才会释放锁。遇到死锁之后,有这样两种情况解决。

1.设置超时时间,如果没有获取到锁的话, 直接放弃(默认是50秒)

2.通过死锁检测,然后进行回滚某个事务。(主动死锁检测默认是开启的)

可以通过deadlock—detect进行检测。但是这样也是有负担的,每个线程都需要进行检测,则就会增大延迟。

推荐阅读:https://juejin.cn/post/6936083717051908104open in new window