步步揭秘:MySQL共享锁的特性-2
前言
MySQL锁系列之前有了2篇文章,如下所示:
上一篇文章留了个思考题,共享锁的共享体现在哪里,排它锁的排它又体现在哪里?
那么本章内容给大家聊聊:FOR UPDATE , 排它锁。
范例
按照传统根据例子给大家聊聊,表结构如下所示:
排它锁的关键是for update
我们同样开启3个MySQL控制台进行测试。
- 【控制台1】在第一个控制台先输入如下命令:
2.【控制台2】在第二个控制台输入:
此时第二个控制台开始阻塞。
3.【控制台3】继续在第三个控制台对 id为1的city进行更改,那么会如何了?
此时控制台3会一直阻塞。
4.【控制台1】接下来在第一个控制台输入提交指令,再看看结果:
当我输入commit并按下回车提交第一个控制台的事务的时候:
- 控制台2的查询结果出来,说明其获取到了控制台一释放的锁。
- 控制台3继续阻塞,继续等待。
5.【控制台2】在控制台2继续提交事务后,锁释放!
6.【控制台3】控制台3不再阻塞,成功更新数据。
对比
根据共享锁和排他锁的范例对比,你能发现2者的不同吗?
——其实通过第2步的操作查询操作,你应该发现了特性:
- 多个控制台中使用LOCK IN SHARE MODE没有阻塞。
- 但是多个控制台中使用FOR UPDATE会阻塞。
这其实就是2者最大的区别。
- SHARE MODE的锁是共享的,大家都可以获取。
- FOR UPDATE锁是独占的,只有一个事务可以获取,其他想获取锁的,都通通阻塞在哪里吧。
二者的共同点都是:
事务未提交前,阻塞更新和删除操作。
不管是共享锁还是排它锁,使用不当都会引起整个表的锁定,使用不当如何理解?下一篇文章将为大家进行分析什么情况下会引起整个表的锁定。
亲爱的小伙伴们,大家有什么疑问或者建议请留言告知,博主每一个评论都会认真阅读,原创不易,还请多多关注。
请先 后发表评论~