2023-12-09|閱讀時間 ‧ 約 5 分鐘

[筆記] MySQL 有哪些鎖?

最近在準備面試新職缺的關係,開始得將曾經學的內容再回憶回來,有時候做筆記的方式,就是希望在回顧時,這些資源跟知識能夠在最短時間記憶起來。

現在AI工具太多,且框架對於資安支援及處理也越來越方便,反而開始會容易忽略最底層的知識,這邊回顧MySQL的鎖,順便記錄一下找到的一些影片資源(我是屬於看影片記憶法),太多文字說明有時候我就是無法吸收進去。


SQL面試題:MySQL 有哪些鎖?


簡單整理筆記重點

InnoDB是一種用於關聯式數據庫管理系統(RDBMS)中的存儲引擎,最常用於MySQL數據庫系統。

InnoDB使用MVCC機制,允許多個事務(Transaction)同時修改同一個數據表的不同行。這提高了數據庫的並發性,允許多個事務同時進行而不互相干擾。

註:在資料庫管理系統中,一個事務是指一系列的操作,這些操作要麼全部成功執行,要麼全部失敗回滾,以保證數據的一致性和完整性。在一個事務中,如果有任何一個操作失敗,整個事務就會被回滾到開始前的狀態,這種機制稱為ACID(原子性、一致性、隔離性、持久性)。

InnoDB他有兩種鎖,一種是表級鎖,另一種為行級鎖,但通常使用行級鎖,這意味著在事務中只有實際需要的數據行被鎖定,而不是整個數據表,這有助於減少鎖定的衝突,提高性能。

而行級鎖又有兩種,一種叫共享鎖(讀鎖)及排他鎖(寫鎖)。

  • 共享鎖(S): 允許獲得共享鎖的事務讀取該資料行,因共享鎖因為只有讀,所以其他人也可以同時獲取讀鎖,而如果加了共享鎖,則會阻止其他事務去修改這行數據,避免你在讀取資料行的過程中,別人去修改了這行資料。
  • 排他鎖(X): 允許獲得排他鎖的事務更新或刪除資料行,故加上排他鎖,其他事務是不可以獲得該資料行上的共享鎖和排他鎖。


接著是表級鎖,在innoDB表也存在了兩種表級鎖,一種是LOCK TABLES 語句手動指定的鎖(),另一種由InnoDB自動添加的意向鎖(Intention Locks),意向鎖介紹跟範例可參考這裡

而意向鎖也分為共享和排他兩種

  • 意向共享鎖(intention shared lock, IS) : 事務有意對資料中的某些行加共享鎖(S鎖)
  • 意向排他鎖(intention exclusive lock, IX):事務有意對資料中的某些行加排他鎖(X鎖)

在執行以下的語句,簡稱事務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面試指南 (朋友傳給我的好貨)。

附上影片連結



其他參考文件連結

MySQL锁:InnoDB行锁需要避免的坑

https://github.com/asdbex1078/MySQL

https://juejin.cn/post/6844903666332368909


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.