標籤:tab mysql intent 寫鎖 意圖鎖定 應用 折扣 顆粒度 body
當並發事務同時訪問一個資源的時候,有可能導致資料不一致。因此需要一種致機制來將訪問順序化。鎖就是其中的一種機制。
資料庫上的操作可以歸納為兩中,讀和寫。多個事務同時讀一個對象的時候,是不會有衝突的。
同時讀和寫或者同時寫才會產生衝突。因此為了提高並發性,通常定義兩種鎖:
A. 共用鎖定(Shared Lock、S鎖) 也叫讀鎖.
共用鎖定表示對資料進行讀操作。因此多個事務可以同時為一個對象加共用鎖定。
B. 獨佔鎖定(Exclusive Lock、X鎖) 也叫寫鎖.
獨佔鎖定表示對資料進行寫操作。如果一個事務對對象加了獨佔鎖定,其他事務就不能再給它加任何鎖了。
C.意圖鎖定(Intention Lock)意向讀鎖(IS)和意向寫鎖(IX)
在給一行記錄加鎖前,首先要給該表加意圖鎖定,也就是同時要加表意圖鎖定和行鎖。
鎖相容矩陣
總的來說,MySQL各儲存引擎使用了三種類型(層級)的鎖定機制:行級鎖定,頁級鎖定和表級鎖定。下面我們先分析一下MySQL這三種鎖定的特點和各自的優劣所在。
行級鎖定(row-level)
通常用在DML語句中,如INSERT, UPDATE, DELETE等。
行級鎖定最大的特點就是鎖定對象的顆粒度很小,也是目前各大資料庫管理軟體所實現的鎖定顆粒度最小的。由於鎖定顆粒度很小,所以發生鎖定資源爭用的機率也最小,能夠給予應用程式儘可能大的並發處理能力而提高一些需要高並發應用系統的整體效能。
雖然能夠在並發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端。由於鎖定資源的顆粒度很小,所以每次擷取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了。此外,行級鎖定也最容易發生死結。
表級鎖定(table-level)
通常用在DDL語句中,如DELETE TABLE,ALTER TABLE等。
和行級鎖定相反,表層級的鎖定是MySQL各儲存引擎中最大顆粒度的鎖定機制。該鎖定機制最大的特點是實現邏輯非常簡單,帶來的系統負面影響最小。所以擷取鎖和釋放鎖的速度很快。由於表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死結問題。
當然,鎖定顆粒度大所帶來最大的負面影響就是出現鎖定資源爭用的機率也會最高,致使並大度大打折扣。
頁級鎖定(page-level)
頁級鎖定是MySQL中比較獨特的一種鎖定層級,在其他資料庫管理軟體中也並不是太常見。頁級鎖定的特點是鎖定顆粒度介於行級鎖定與表級鎖之間,所以擷取鎖定所需要的資源開銷,以及所能提供的並發處理能力也同樣是介於上面二者之間。另外,頁級鎖定和行級鎖定一樣,會發生死結。
MySQL鎖機制