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