Innodb 共享锁 排他锁 及应用

服务器

浏览数:200

2019-8-21

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