vlambda博客
学习文章列表

面试现场 之 MySQL锁机制

面试现场 之 MySQL锁机制

第一问

面试官:小王,看你简历上说,精通MySQL,那你能讲讲MySQL的锁机制吗(面试官一脸坏笑)?

小王: (小王心里笑了笑)不慌不忙的说,MySQL锁设立初衷是为了处理并发问题,当出现并发访问的时候,数据库利用锁合理的控制资源。

第二问

面试官:那你知道有哪几种锁吗?
小王:根据锁的范围,MySQL的锁分为全局锁,表锁和行锁。

面试官心想,这小伙子懂得还挺多,让我再追问一下。

第三问

面试官:那你能说说这几种锁的含义及应用场景吗?
小王:全局锁就是对整个数据库实例加锁,使用场景就是做全库逻辑备份。
表级锁有两种,一种是表锁,一种是元数据锁。表锁就是对表进行加锁,使用lock tables ... read/write 加锁,使用unlock tables主动释放锁。
另一种的元数据锁,不需要显式使用,访问一个表的时候会被自动加上。

问到这里,面试官感觉小王的基础知识还不错,抛出了终极陷阱问题。

终极提问

面试官:小王,那如何给表加字段呢?

小王心里一想,这个问题也太简单了吧,随口而出。

小王:alter table t add f int。

哈哈,面试官心里暗爽,小王啊小王终于掉到我的陷阱里了。

面试官:这样不会有什么问题吗?

小王心里一惊,额头上冒出了汗。小声说道。

小王:能不能给点提示?

面试官得意洋洋,小伙子还是有点嫩呀,那我就给你点提示。

面试官:你可以从读锁和写锁的角度去考虑。

小王定了定神,脑子迅速过了一下读锁和写锁的知识,哇,想到了。

小王:若有会话 A 执行了查询操作,将会对表加一个读锁,此时会话B要执行 alter table 修改列时读锁没有释放,会话B的操作需要写锁,只能被阻塞。又进来一个会话C要查询数据的话,申请读锁,会被会话C阻塞。那么这个表就完全不可读了。要安全的给表加列的话,需要制定一个超时时间,alter table tbl_name WAIT N add column. 这样的话,超时之后,会主动释放写锁,不影响后续的操作。

听到这里,面试官满意的点点头。

面试官:小王,回答得很不错吗。这一波面试在我这里看是通过了。回去等通知吧。小王:谢谢面试官,咱们下次再聊。