一文讀懂Mysql的鎖機制

2021-10-09 12:48:08 字數 996 閱讀 2029

懂的越多,不懂的越多

今天只說mysql本身的鎖機制和innodb的鎖,有不對的地方,歡迎指正。

mysql自帶的鎖機制(全域性鎖,表級鎖),而行級鎖由引擎來實現,但是要記住不是所有引擎都對行級鎖有支援,比如myisam就不支援行級鎖,所以基本沒有太多的應用場景了。

全域性鎖

主要是用來進行全庫邏輯備份使用,原理是將資料庫設為唯讀,然後對每張表進行備份。

注意:因為給全庫加鎖,所以其他事務所有的修改都會掛起。mysql官方的資料庫備份使用的並不是這個方案,官方備份方案使用的是一致性檢視的方式進行備份。哪為什麼還要有全域性鎖這個東西哪?因為myisam引擎不支援啊,實在是令人頭大。

表級鎖分為表鎖和mdl

提到mdl,有興趣的朋友可以了解下ddl、dml、dcl、mdl、wal都是個啥,以免面試的時候被問懵。

表鎖和全域性鎖差不多,只不過從名字就可以看出來,表鎖是將整張表設定為唯讀。

mdl:元資料鎖,5.5 版本中引入,dml(增刪改查)操作時會預設加上讀鎖,ddl(表結構變更)操作會加上寫鎖。讀鎖與讀鎖不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥。

行級鎖:記錄鎖,間隙鎖, 臨鍵鎖

記錄鎖:對一行記錄加鎖

間隙鎖:主要是為了實現可重複讀這個隔離事務,鎖住索引記錄中的間隔,或者第一條索引記錄之前的範圍,又或者最後一條索引記錄之後的範圍,mysql的隔離級別必須在rr,並且必須要有索引,因為間隙鎖是針對索引的。如果沒有索引,那麼就會滿足鎖定最後一條索引記錄之後的範圍,也就是全表被鎖定了。

插入意向鎖:間隙鎖的優化變種,在insert時會鎖定範圍,但是插入的位置如果不衝突的話,那麼其他事務也可以對該鎖定範圍進行insert,這樣提高了併發。

臨鍵鎖:間隙鎖+記錄鎖,鎖住範圍的同時也鎖定了行資料,是為了解決幻讀問題的鎖,innodb預設使用的鎖就是 臨鍵鎖

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...

堆疊 一文讀懂

堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out 的原則。因此 棧 ...