mysql ix is_关于MySQL中的共享锁(S)、排它锁(X)、意向共享锁(IS)、意向排它锁(IX)...
一.S鎖和X鎖:S鎖和X鎖都屬于行數(shù)
二.意向鎖:表鎖,相互兼容,表明“某個(gè)事務(wù)持有了鎖、或準(zhǔn)備去持有鎖”
1、意向鎖的存在是為了協(xié)調(diào)行鎖和表鎖的關(guān)系,支持多粒度(表鎖與行鎖)的鎖并存。
2、
1)意向共享鎖(IS鎖):事務(wù)在請(qǐng)求S鎖前,要先獲得IS鎖
2)意向排他鎖(IX鎖):事務(wù)在請(qǐng)求X鎖前,要先獲得IX鎖
3、例子:事務(wù)A修改user表的記錄r,會(huì)給記錄r上一把行級(jí)的排他鎖(X),同時(shí)會(huì)給user表上一把意向排他鎖(IX),這時(shí)事務(wù)B要給user表上一個(gè)表級(jí)的排他鎖就會(huì)被阻塞。意向鎖通過這種方式實(shí)現(xiàn)了行鎖和表鎖共存且滿足事務(wù)隔離性的要求。
q1:為什么意向鎖是表級(jí)鎖呢?
當(dāng)我們需要加一個(gè)排他鎖時(shí),需要根據(jù)意向鎖去判斷表中有沒有數(shù)據(jù)行被鎖定(行鎖);
(1)如果意向鎖是行鎖,則需要遍歷每一行數(shù)據(jù)去確認(rèn);
(2)如果意向鎖是表鎖,則只需要判斷一次即可知道有沒數(shù)據(jù)行被鎖定,提升性能。
q2:意向鎖怎么支持表鎖和行鎖并存?
(1)首先明確并存的概念是指數(shù)據(jù)庫(kù)同時(shí)支持表、行鎖,而不是任何情況都支持一個(gè)表中同時(shí)有一個(gè)事務(wù)A持有行鎖、又有一個(gè)事務(wù)B持有表鎖,因?yàn)楸硪坏┍簧狭艘粋€(gè)表級(jí)的寫鎖,肯定不能再上一個(gè)行級(jí)的鎖。
(2)如果事務(wù)A對(duì)某一行上鎖,其他事務(wù)就不可能修改這一行。這與“事務(wù)B鎖住整個(gè)表就能修改表中的任意一行”形成了沖突。所以,沒有意向鎖的時(shí)候,讓行鎖與表鎖共存,就會(huì)帶來很多問題。于是有了意向鎖的出現(xiàn),如q1的答案中,數(shù)據(jù)庫(kù)不需要在檢查每一行數(shù)據(jù)是否有鎖,而是直接判斷一次意向鎖是否存在即可,能提升很多性能。
三.下圖表示意向鎖和共享鎖、排他鎖的兼容關(guān)系。
1.當(dāng)事務(wù)A對(duì)某個(gè)數(shù)據(jù)范圍(行或表)上了“某鎖”后,另一個(gè)事務(wù)B是否能在這個(gè)數(shù)據(jù)范圍上“某鎖”。
2.意向鎖相互兼容,因?yàn)镮X、IS只是表明申請(qǐng)更低層次級(jí)別元素(比如 page、記錄)的X、S操作。
3.表級(jí)S鎖和X、IX鎖不兼容:因?yàn)樯狭吮砑?jí)S鎖后,不允許其他事務(wù)再加X鎖。
4.表級(jí)X鎖和 IS、IX、S、X不兼容:因?yàn)樯狭吮砑?jí)X鎖后,會(huì)修改數(shù)據(jù),所以即使是行級(jí)排他鎖,因?yàn)楸砑?jí)鎖定的行肯定包括行級(jí)鎖定的行,所以表級(jí)X和IX、X都不兼容。
注意:上了行級(jí)X鎖后,行級(jí)X鎖不會(huì)因?yàn)橛袆e的事務(wù)上了IX而堵塞,一個(gè)mysql是允許多個(gè)行級(jí)X鎖同時(shí)存在的,只要他們不是針對(duì)相同的數(shù)據(jù)行。
————————————————版權(quán)聲明:本文為CSDN博主「本兮言」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/ligupeng7929/article/details/89216881
總結(jié)
以上是生活随笔為你收集整理的mysql ix is_关于MySQL中的共享锁(S)、排它锁(X)、意向共享锁(IS)、意向排它锁(IX)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天需要做的事情
- 下一篇: python:talib 计算 SAR