最近受廢話文學的影響,所以有了今天的這個標題,希望大家能喜歡。大家不喜歡也沒關系,反正我喜歡。
魯迅先生曾經說過“我家門前有兩棵樹,一棵是棗樹,另一棵還是棗樹。”,由此可見,這老爺子算是把廢話文學給玩明白了。
希望大家也能,聽君一席話,如聽一席話。
聊完閑篇,咱們說回正題:什么是意向鎖?為什么需要意向鎖?
PS:這里沒意向書什么事啊,標題中有,純粹是為了好玩。它們不能說沒什么關系,那是一點關系都沒有啊。
意向鎖(Intention Locks)是 MySQL InnoDB 引擎中的一種鎖機制(表級鎖),用于協調事務間的加鎖操作,以避免沖突和死鎖的發生。
例如,事務 A 加鎖了 Users 表中的一行數據(行鎖),而事務 B 要對整個 Users 表進行加鎖(表鎖),那么這個時候,如果沒有意向鎖,那事務 B 就會加鎖成功了。而事務 B 如果加鎖成功的話,那么它是可以對表中的任意數據行進行操作的,包括事務 A 加鎖的那行數據,所以,這個時候就發生了鎖沖突。
為了避免這個問題,所以 MySQL 引入了意向鎖,在事務 A 添加行鎖的時候,先添加意向鎖,而事務 B 在添加表鎖的時候,先判斷一下意向鎖,如果有意向鎖了,它就不能加表鎖了,這樣避免了鎖沖突,提升了加鎖判斷的效率。
想想一下,如果沒有意向鎖的話,那么事務 B 在加表鎖的時候,只能一行行的判斷有沒有行鎖,而這種判斷的效率是非常低的,尤其數據量比較大時。
意向鎖分為以下兩種類型:
意向共享鎖(Intention Shared lock,IS):表示在某個資源上設置共享鎖。也就是讀鎖,用于讀取數據的操作,允許多個事務同時持有(共享鎖),不互斥。
意向排他鎖(Intention Exclusive lock,IX):表示在某個資源上設置排他鎖。也就是寫鎖,用于修改和更新數據操作,并且同一時間只能由一個事務持有,不能和其他事務共同持有,具有互斥性和排他性。
小結
意向鎖并不能直接由開發者創建和使用,它是存在于 MySQL 中,由 MySQL 自行維護的一種協調事務加鎖的機制。它在事務創建行鎖和表鎖時創建,在事務提交或回滾之后自動釋放。