zoukankan      html  css  js  c++  java
  • 【转】Innodb 共享锁 排他锁 及应用

    MySQL版本:5.6

    注意点:
    • 单纯的 SELECT 不会加锁,INSERT UPDATE DELETE 默认加 X 。
    • 文中的读都不是单纯 SELECT ,单纯的 SELECT 任何时候都可以进行。

    共享锁 shared(S) lock

    定义:A shared (S) lock permits the transaction that holds the lock to read a row.
    事务 T1 获取了数据行 r 的共享锁,事务 T2 依然能获得 r 的共享锁,但不能获得排他锁。

    说人话:我可以读,你也可以读。 但是你不能改(如果没有其他人读我可以偷偷改)。

    锁级别:Row Lock 行级别

    加锁方式:SELECT ... LOCK IN SHARE MODE

    排它锁 exclusive(X) lock

    定义:An exclusive (X) lock permits the transaction that holds the lock to update or delete a row.
    事务 T1 获取了数据行 r 的排他锁,T2 既不能获得 r 的共享锁也不能获得 r 的排他锁。

    说人话:我在干活,你不能读写。

    锁级别:Row Lock 行级别

    加锁方式:SELECT ... FOR UPDATE

    业务应用(重要):

    大家看完上面的定义可能有点枯燥,难以理解,我们举一点实际的例子。

    排他锁很好理解,比如修改银行卡余额,现在是 100,我要给他扣20,我不先给锁上,那别人也拿着 100 去扣个 30,整个余额就乱了。但是我先锁上了,别人就读不到 100,只能等我改完,然后读到 80 再去减 30。

    那么什么时候需要用到共享锁呢,有人说我直接用排他锁不就行了么。
    比如盘点库存,我需要在我盘点货物的时候,别人不能进出库,否则盘点的数据就不准确了,而我自己只需要读不需要修改库存。这时候就需要用到共享锁了,为什么不用排他锁呢,理论业务上来说,我在盘点,那我的合伙人也能盘点,不能说我在盘点,就不让别人盘点吧。
    所以共享锁真正的使用场景是大家都要读,但是不让其他人写。

    上文说过,如果没有其他人同时加共享锁,我就能偷偷改。为什么叫做偷偷呢,如果别人也加了共享锁,你就改不了了,所以这叫做偷偷。至于为什么我能修改,其实本质上是我吧共享锁升级成为了排他锁,这是允许的。



    作者:剑指TOP
    链接:https://www.jianshu.com/p/e92108e8e1e3
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    简述序列化与反序列化
    更新Kali源&&Docker vulhub 安装
    超级弱口令爆破工具&&hydra
    通达OA任意用户登录
    读书笔记——白帽子讲Web安全
    骑士CMS搭建与利用
    记一次DVWA的SQL注入测试
    网络基础
    C#类对象的事件定义
    [开源]FreeSCADA的通道数据与控件属性关联以及自动刷新机制研究
  • 原文地址:https://www.cnblogs.com/lyhero11/p/12229305.html
Copyright © 2011-2022 走看看