自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

美團一面:能不能通俗的解釋下為什么要有意向鎖這個東西?

數(shù)據(jù)庫 MySQL
在意向鎖存在的情況下,事務(wù) A 如果想申請行級讀鎖,就必須先申請該表的意向讀鎖,申請成功后才能繼續(xù)申請某行記錄的行級讀鎖。

眾所周知,InnoDB 中既有讀鎖也有寫鎖,也稱為共享鎖和排他鎖,這兩種鎖既可以加在整張表上,也可以加在行上。

MySQL 自身就提供了表鎖的能力:

  • 讀鎖:LOCK TABLE table_name READ 用讀鎖鎖表,會阻塞其他事務(wù)的寫操作
  • 寫鎖:LOCK TABLE table_name WRITE 用寫鎖鎖表,會阻塞其他事務(wù)的讀和寫操作

行鎖是 InnoDB 存儲引擎提供的,MySQL 本身并不提供行級鎖的能力:

  • 讀鎖,如SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE 加行級讀鎖,會阻塞其他事務(wù)對該行記錄的寫操作
  • 寫鎖,如SELECT * FROM table_name WHERE ... FOR UPDATE 加行級寫鎖,會阻塞其他事務(wù)對該行記錄的的讀和寫操作

又有表鎖又有行鎖,我們來考慮下這兩種類型的鎖共存的問題??聪旅孢@個例子:

事務(wù) A 加了行級讀鎖,鎖住了表中的一行,讓這一行只能讀,不能寫。

之后,事務(wù) B 嘗試申請整個表的寫鎖。

圖片

如果事務(wù) B 申請成功,那么理論上它就能修改表中的任意一行,這與 A 持有的行級讀鎖是沖突的。

數(shù)據(jù)庫需要避免這種沖突,就勢必要讓 B 的申請被阻塞,直到 A 釋放行級讀鎖。

那數(shù)據(jù)庫要怎么判斷這個沖突呢?

  • 步驟 1:判斷表是否已被其他事務(wù)用表級鎖鎖住了整張表
  • 步驟 2:判斷表中的每一行是否已被行級鎖鎖住

看起來沒有什么困難的,但請注意步驟 2,判斷表中的每一行,各位,如何判斷?

顯然,需要遍歷!遍歷表中的每一行。

小學(xué)生都能想到這樣的判斷方法效率實在太過于低下了。

于是就有了意向鎖!

我們先來看下意向鎖的解釋:

Intention locks are table-level locks that indicate which type of lock (shared or exclusive) a transaction requires later for a row in a table.

意向鎖是一個表級鎖,其作用就是指明接下來的事務(wù)將會用到哪種鎖。

有兩種意向鎖:

  • 意向共享鎖/讀鎖(IS Lock):當(dāng)事務(wù)想要獲得一張表中某幾行的讀鎖(行級讀鎖)時,InnoDB 存儲引擎會自動地先獲取該表的意向讀鎖(表級鎖)
  • 意向排他鎖/寫鎖(IX Lock):當(dāng)事務(wù)想要獲得一張表中某幾行的寫鎖(行級寫鎖)時,InnoDB 存儲引擎會自動地先獲取該表的意向?qū)戞i(表級鎖)

注意這里的自動:申請意向鎖的動作是數(shù)據(jù)庫完成的,就是說,事務(wù) A 申請一行的行鎖的時候,數(shù)據(jù)庫會自動先開始申請表的意向鎖,不需要我們程序員使用代碼來申請。

在意向鎖存在的情況下,事務(wù) A 如果想申請行級讀鎖,就必須先申請該表的意向讀鎖,申請成功后才能繼續(xù)申請某行記錄的行級讀鎖。

在意向鎖存在的情況下,上面的判斷可以改成:

  • 步驟 1(不變):判斷表是否已被其他事務(wù)用表級鎖鎖住了整張表
  • 步驟 2:發(fā)現(xiàn)表上有意向讀鎖(說明表中有些行被行級讀鎖鎖住了),意向讀鎖和表級寫鎖互斥,因此,事務(wù) B 申請表的寫鎖會被阻塞。

也就是說原先步驟 2 的遍歷表中每一行的操作,簡化成了判斷下整張表上有無表級意向鎖就行了,效率大幅提升。

圖片

這就是為什么要有意向鎖了。

責(zé)任編輯:武曉燕 來源: 飛天小牛肉
相關(guān)推薦

2023-07-03 08:15:46

MySQLInnoDB

2022-04-21 10:39:29

InnoDB意向鎖SQL

2024-05-15 09:23:45

MySQL排他鎖共享鎖

2022-06-15 09:02:32

JVM線程openJDK

2024-10-31 08:50:14

2024-04-24 09:02:58

線程池面試鎖升級

2023-12-28 17:33:25

意向鎖MySQL開發(fā)者

2025-03-25 12:00:00

@Value?Spring開發(fā)

2022-11-28 14:27:17

插入意向鎖age

2024-04-01 00:00:00

Redis緩存服務(wù)消息隊列

2024-04-22 00:00:00

CASCPU硬件

2023-07-13 09:16:47

循環(huán)隊列指針front?

2022-01-04 22:11:43

磁盤Redolog持久化

2024-11-26 08:52:34

SQL優(yōu)化Kafka

2024-08-27 09:05:45

2011-08-09 16:08:53

數(shù)據(jù)庫連接

2024-06-06 09:03:37

MySQL數(shù)據(jù)庫共享鎖

2024-10-30 10:38:08

2024-05-27 11:35:40

2022-07-12 08:56:18

公平鎖非公平鎖Java
點贊
收藏

51CTO技術(shù)棧公眾號