在了解innodb事務併發控制的時候,裡面提到了意向鎖(intention lock),這裡簡單做下總結
在innodb的使用場景中,裡面有實現了行鎖,具體有對行的讀鎖,寫鎖。另外,如果對乙個表作一些統一的操作,表的層面,有表層級的讀鎖,寫鎖。那這個意向鎖是幹嘛用的?
我們假設乙個場景,乙個事務a正在寫某個表t的第r行加了寫鎖,另乙個事務b嘗試去對整個表做操作(例如修改表結構的時候),b嘗試去對整個表加乙個寫鎖。則此時,需要執行兩個步驟:
1)檢查表t是否被上了讀鎖或者寫鎖。
2)遍歷所有行,檢視每一行是否被上了讀鎖或寫鎖。
步驟1可以很快執行,但是步驟2,則需要非常耗時,效率低下。此時,意向鎖出場了
意向鎖的作用,相當於就是在低層次資源是否使用,加了乙個tag來標識而已。對於步驟2的執行可以大大加速,僅此而已。
有了意向鎖之後,事務a的操作步驟如下:
1)事務a上行鎖時,先對表上乙個寫意向鎖。
2)事務a對r行上乙個寫鎖。
事務b想對錶上寫鎖,操作步驟如下:
1)檢查表t是否被上了讀鎖或寫鎖。
2)檢查表是否被上了意向鎖(因為所有行的讀寫之前,會先上意向鎖),即可判斷表中是否有任何一行被上了讀鎖或寫鎖。
步驟2在檢查邏輯的時間複雜度,由於增加了意向鎖之後,時間複雜度由o(n),提公升到了o(1),效率大幅提公升。另外,從這個邏輯來看,讀和寫的意向鎖,兩者是彼此相容,當時讀到這他們之間的相容關係的時候,一直不太理解,沒理解到點上。
意向鎖的設計目的,只是為了方便上層資源檢查下層資源是否有被占用的加速設計,本身並不能增加併發度。
從意向鎖的設計思路來看,我們在系統對層次資源的併發使用的時候,也是可以引數意向鎖的設計思路,做到觸類旁通,真正提公升技術方案的理解水平!
sql server中意向鎖的作用
意向鎖 資料庫引擎使用意向鎖來保護鎖層次結構的底層資源,以防止其他事務對自己鎖住的資源造成傷害,提高鎖衝突檢測效能。例如,當讀取表裡的頁面時,在請求頁共享鎖 s鎖 之前,事務在表級請求共享意向鎖。這樣可以防止其他事務隨後在表上獲取排他鎖 x鎖 修改整個 意向鎖可以提高效能,因為資料庫引擎僅在表級檢查...
詳解 MySql InnoDB 中意向鎖的作用
innodb 支援多粒度鎖 multiple granularity locking 它允許行級鎖與表級鎖共存,而意向鎖就是其中的一種表鎖。需要強調一下,意向鎖是一種不與行級鎖衝突表級鎖,這一點非常重要。意向鎖分為兩種 即 意向鎖是有資料引擎自己維護的,使用者無法手動操作意向鎖,在為資料行加共享 排...
詳解 MySql InnoDB 中意向鎖的作用
innodb 支援多粒度鎖 multiple granularity locking 它允許行級鎖與表級鎖共存,而意向鎖就是其中的一種表鎖。需要強調一下,意向鎖是一種不與行級鎖衝突表級鎖,這一點非常重要。意向鎖分為兩種 事務要獲取某些行的 s 鎖,必須先獲得表的 is 鎖。select column...