對于select語句:
1、當採用表掃描時,會直接鎖定page,而不是鎖定詳細的某條記錄,所以會有這些鎖:
A、數據庫S鎖
B、表的IS鎖
C、頁的S鎖
2、當採用索引來查找數據時,會鎖定詳細的記錄,所以會有這些鎖:
A、數據庫S鎖
B、索引中page的 IS鎖
C、索引中page中的key的S鎖
D、表的IS鎖
E、頁的IS鎖
F、RID的S鎖
3、對于讀過的頁面,會加一個IS鎖。
對于使用的索引,會對key加上S鎖,對索引key所在的頁面會加上IS鎖。
在查詢過程中,會對每一條讀到的記錄或key加上S鎖。
假設記錄不是我們要查找的,那么就會釋放S鎖,假設記錄要返回,依據隔離級別,假設是read committed,那么會釋放,否則就不會釋放。
對于update語句:
1、當採用表掃描時,會直接鎖定page,而不是鎖定詳細的某條記錄,所以會有這些鎖:
A、數據庫S鎖
B、表的IX鎖
C、頁的U鎖 或者是X鎖,兩者的差別在于,因為update語句也是要先找到數據,才干進行改動,所以在查數據時,會對頁加上IU鎖,然后在繼續查看頁中的記錄時,會先對記錄加上U鎖,假設發現這條記錄,不是須要更新的,那么會馬上釋放U鎖,假設發現這條記錄就是要更新的,那么就會加上X鎖,然后update這條記錄,然后查看下一條記錄。
2、當採用索引來查找數據時,會索引詳細的記錄,所以會有這些鎖:
A、數據庫S鎖
B、索引中page的 IU鎖
C、索引中page中的key的U鎖,也就是不希望別的會話來改動這條記錄的key字段,比方如今有2個會話,1個要改動第10條記錄的name字段,還有一個是要改動第10條記錄的key字段,顯然,在一個會話改動同一條記錄的name字段時,肯定會堵塞住還有一個會話改動key字段。也就是說,對同一條記錄的不同字段,肯定是不能同一時候改動的,總是有個先后,否則數據就不一致了。
D、表的IX鎖
E、頁的IU鎖 或者是IX鎖,這個差別和上面是一樣的,查詢時用的是IU鎖,當發現這個頁內部有須要改動的記錄時,會轉化為IX鎖。
F、RID的X鎖
3、對每個使用的索引,會對key加上U鎖,對索引key所在的頁面會加上IU鎖。
因為update也須要先找到記錄,然后才干更新,所以,在掃描過程中,對要掃描的記錄所在的頁,加上IU鎖,對頁中的記錄加上U鎖,假設這些記錄要改動,那么會升級為X鎖,頁面會升級為IX鎖。假設這個記錄不須要更新,那么會釋放U鎖,假設整個頁面都沒有要改動的記錄,那么也會釋放IU鎖。
另外,使用到要改動列的索引越多,那么鎖也會越多。比方如今要改動name字段的值,而包括name字段的索引有2個,那么在改動name時,也須要鎖定這2個索引的頁面和key,所以會先改動表中name字段的值,然后再改動涉及到name字段的2個索引的key值,這個改動操作是先刪除,然后再插入key值,比方,要update 3條記錄,那么最后改動索引時,會申請6個key 的X鎖,3個是要刪除的,3個是要插入的。
只是須要特別注意的是,update語句和select 語句的差別在于,update語句獲取的鎖,直到事務結束,才會釋放。
對于Insert 語句:
A、數據庫S鎖
B、表的IX鎖
C、頁的IX鎖,對于要新插入數據的頁,也會有一個IX鎖。
D、RID,對要新插入的數據,會申請一個X鎖。
E、假設表中有多個索引,那么每一個索引上都要插入一條新的數據,要插入數據所在頁上,會有一個IX鎖。
F、要插入索引中的key,也會有一個X鎖。
注意:IS、IU(臨時沒發如今表級別上有這個鎖)、IX這3個意向鎖,都是在表級別、頁級別的,而S、U(
臨時沒
沒發如今表級別有這個鎖)、X 能夠在多個級別上。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
