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



































