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