步步揭秘:MySQL共享锁的特性-2

前言

MySQL锁系列之前有了2篇文章,如下所示:

10行文字解读:MySQL中2类引擎的区别(BAT面试题)

步步揭秘:MySQL共享锁的特性- 1

上一篇文章留了个思考题,共享锁的共享体现在哪里,排它锁的排它又体现在哪里?

那么本章内容给大家聊聊:FOR UPDATE , 排它锁。

范例

按照传统根据例子给大家聊聊,表结构如下所示:

排它锁的关键是for update

我们同样开启3个MySQL控制台进行测试。

  1. 【控制台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锁是独占的,只有一个事务可以获取,其他想获取锁的,都通通阻塞在哪里吧。

二者的共同点都是:

事务未提交前,阻塞更新和删除操作

不管是共享锁还是排它锁,使用不当都会引起整个表的锁定,使用不当如何理解?下一篇文章将为大家进行分析什么情况下会引起整个表的锁定。

亲爱的小伙伴们,大家有什么疑问或者建议请留言告知,博主每一个评论都会认真阅读,原创不易,还请多多关注。

举报
评论 0