最近在準備面試新職缺的關係,開始得將曾經學的內容再回憶回來,有時候做筆記的方式,就是希望在回顧時,這些資源跟知識能夠在最短時間記憶起來。
現在AI工具太多,且框架對於資安支援及處理也越來越方便,反而開始會容易忽略最底層的知識,這邊回顧MySQL的鎖,順便記錄一下找到的一些影片資源(我是屬於看影片記憶法),太多文字說明有時候我就是無法吸收進去。
簡單整理筆記重點
InnoDB是一種用於關聯式數據庫管理系統(RDBMS)中的存儲引擎,最常用於MySQL數據庫系統。
InnoDB使用MVCC機制
,允許多個事務(Transaction)同時修改同一個數據表的不同行。這提高了數據庫的並發性,允許多個事務同時進行而不互相干擾。
註:在資料庫管理系統中,一個事務是指一系列的操作,這些操作要麼全部成功執行,要麼全部失敗回滾,以保證數據的一致性和完整性。在一個事務中,如果有任何一個操作失敗,整個事務就會被回滾到開始前的狀態,這種機制稱為ACID(原子性、一致性、隔離性、持久性)。
InnoDB他有兩種鎖,一種是表級鎖,另一種為行級鎖
,但通常使用行級鎖
,這意味著在事務中只有實際需要的數據行被鎖定,而不是整個數據表,這有助於減少鎖定的衝突,提高性能。
而行級鎖又有兩種,一種叫共享鎖(讀鎖)及排他鎖(寫鎖)。
更新或刪除
資料行,故加上排他鎖,其他事務是不可以
獲得該資料行上的共享鎖和排他鎖。接著是表級鎖,在innoDB表也存在了兩種表級鎖,一種是LOCK TABLES 語句手動指定的鎖(),另一種由InnoDB自動添加的意向鎖(Intention Locks),意向鎖介紹跟範例可參考這裡。
而意向鎖也分為共享和排他兩種
在執行以下的語句,簡稱事務A,他會在id=1這行裡面加上行級排他鎖,因為他要修改這筆紀錄,而在修改這行之前,innoDB也會自動添加了表級意向排他鎖。
begin
select * from t where id = 1 for update
接著使用LOCK TABLES 去讀它,這裡為事務 B 想要取得 t 表的共享鎖,則會產生不兼容的情況,直到等到事務A完成commit後才會執行。
LOCK TABLES t READ;
而意向排他鎖(IX)與意向排他鎖(IX)之間的操作是兼容的(影片當中有一個表格整理)
,主要是當你使用了排他鎖(X),這筆 id=1 就不允許別的事務修改,但是意向排他鎖與意向排他鎖因為是兼容,故可以允許兩筆不同紀錄的修改(id=1 and id=2),而這個行為是為了支持行級的併發,根據意向鎖範例文章總結說明:
意向鎖在保證並發性的前提下,實現了行鎖和表鎖共存且滿足事務隔離性的要求。
//事務A
begin
select * from t where id = 1 for update
//事務b
begin
select * from t where id = 2 for update
而理解mysql的鎖之後,可以再根據這個影片繼續往下探討,MySQL的行級鎖的實現,覺得影片帶上實際執行範例,很方便理解,推薦大家。
附上PHP面試指南 (朋友傳給我的好貨)。
https://github.com/asdbex1078/MySQL
https://juejin.cn/post/6844903666332368909