[筆記] MySQL 有哪些鎖?

更新於 發佈於 閱讀時間約 4 分鐘

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

現在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


avatar-img
15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
DDDDD的沙龍 的其他內容
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
最近看到一些網路教學AWS S3可以部署靜態網頁,就想說那不如試試看將local swagger部署上去,之後還可以透過github action 自動部署swagger到s3上,於是花點時間看個影片並搭配chatgpt來實現
在專案開發的時候,專案架構搭建時團隊就會設定 php code style 檢查,避免整個開發團隊大家走出自己的風格,尤其是兩格空白還是四格空白,總是會有不同意見,這時候定義出團隊code style,並透過配置Github Action CI(Continuous Integration)
為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。
最近剛好分配一個需求,要批次更新一些基礎設定資料,而新系統基礎設定資料都統一由別的團隊維護在Google Sheet 上,一開始是要我寫 Laravel Seeder 塞資料表,後來發現也太多數據要批次更新了,數據要對到何時何年,乾脆來研究串 Google Sheet API 整批塞入在對總行數就好
在撰寫專案時,有時候可能需要做一些特定Exceptions 來拋出error message的情況,而在不同公司任職,大家配置的流程可能就有些不同,這邊將簡單練習如何配置自定義的Exception。
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
最近看到一些網路教學AWS S3可以部署靜態網頁,就想說那不如試試看將local swagger部署上去,之後還可以透過github action 自動部署swagger到s3上,於是花點時間看個影片並搭配chatgpt來實現
在專案開發的時候,專案架構搭建時團隊就會設定 php code style 檢查,避免整個開發團隊大家走出自己的風格,尤其是兩格空白還是四格空白,總是會有不同意見,這時候定義出團隊code style,並透過配置Github Action CI(Continuous Integration)
為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。
最近剛好分配一個需求,要批次更新一些基礎設定資料,而新系統基礎設定資料都統一由別的團隊維護在Google Sheet 上,一開始是要我寫 Laravel Seeder 塞資料表,後來發現也太多數據要批次更新了,數據要對到何時何年,乾脆來研究串 Google Sheet API 整批塞入在對總行數就好
在撰寫專案時,有時候可能需要做一些特定Exceptions 來拋出error message的情況,而在不同公司任職,大家配置的流程可能就有些不同,這邊將簡單練習如何配置自定義的Exception。
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本文介紹資料庫鎖(DB lock)的基本概念、鎖的類型及其優缺點。通過對資料庫鎖的深入探討,我們可以理解如何在多用戶環境下保護資料的一致性與完整性,並瞭解排他鎖、共享鎖、意向鎖等不同類型鎖的作用。此外,文章還分析了鎖競爭、鎖等待和死鎖等可能的問題,幫助讀者更全面地掌握資料庫鎖的運作機制。
Thumbnail
本文介紹關聯式資料庫與非關聯式資料庫的基本概念,闡述兩者的差異及各自的應用場景。文章進一步分析了 MySQL 的兩種主要儲存引擎:MyISAM與InnoDB,並探討了它們的優缺點及使用情境,幫助讀者瞭解選擇適合的資料庫引擎所需考量的因素。
Thumbnail
※ 為什麼我們需要 Transaction? 當我們談到 Transaction(交易)時,指的是一組不可分割的 SQL 操作。這些操作結果只能成功或失敗,以確保資料庫的一致性和完整性。Transaction 是資料庫操作中的一個「邏輯單位」,包含多個操作步驟。如果其中任何一個步驟失敗,整個 Tr
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
※ 為什麼選擇SQLite? 安裝簡單:SQLite是一個零配置的資料庫,不需要複雜的設定和安裝過程。。 使用SQL語法。 設計選擇多元性(MySQL / SQLite):適合於小零件資料應用、嵌入式系統、物聯網設備。 ※ SQLite四大優點: 執行檔檔案很小:資料庫系統需要的磁碟空
Thumbnail
本文介紹了 MyISAM 和 InnoDB 儲存引擎原理的區別和比較,並從讀取效率和寫入效率、結構、任務以及操作等方面探討了兩者的差異。
※ 什麼是資料庫正規化?為什麼需要正規化? 什麼是資料庫正規化? 資料庫正規化是一種設計關聯式資料庫的方法,目的是建立良好結構的關聯表,主要目的有二: 去除重複性:建立沒有重複的關聯表。因為重複資料不只浪費資料庫的儲存空間,而且會產生資料維護上的問題。 去除不一致的相依性:資料相依是指關聯表
※ MySQL是什麼? MySQL是一種開源(免費)的關聯式資料庫管理系統,所以任何人都可以免費使用,是Web開發中最常用的資料庫之一。MySQL 會將資料儲存在由資料列與資料欄組成的資料表中。使用者可使用結構化查詢語言 (通常稱為 SQL) 來定義、操控、控管及查詢資料。  簡單來說,資料
Thumbnail
在這個星光閃爍的數據宇宙中,SQL是一把鑰匙,開啟了通往知識寶庫的大門。想像一下,每一條SELECT語句都像是一段魔法咒語,喚醒沉睡在數據庫深處的信息。今天,我們就要一起踏上這段探秘之旅,將揭開SQL基本查詢指令的神秘面紗,學習如何巧妙地與數據對話。
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本文介紹資料庫鎖(DB lock)的基本概念、鎖的類型及其優缺點。通過對資料庫鎖的深入探討,我們可以理解如何在多用戶環境下保護資料的一致性與完整性,並瞭解排他鎖、共享鎖、意向鎖等不同類型鎖的作用。此外,文章還分析了鎖競爭、鎖等待和死鎖等可能的問題,幫助讀者更全面地掌握資料庫鎖的運作機制。
Thumbnail
本文介紹關聯式資料庫與非關聯式資料庫的基本概念,闡述兩者的差異及各自的應用場景。文章進一步分析了 MySQL 的兩種主要儲存引擎:MyISAM與InnoDB,並探討了它們的優缺點及使用情境,幫助讀者瞭解選擇適合的資料庫引擎所需考量的因素。
Thumbnail
※ 為什麼我們需要 Transaction? 當我們談到 Transaction(交易)時,指的是一組不可分割的 SQL 操作。這些操作結果只能成功或失敗,以確保資料庫的一致性和完整性。Transaction 是資料庫操作中的一個「邏輯單位」,包含多個操作步驟。如果其中任何一個步驟失敗,整個 Tr
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
※ 為什麼選擇SQLite? 安裝簡單:SQLite是一個零配置的資料庫,不需要複雜的設定和安裝過程。。 使用SQL語法。 設計選擇多元性(MySQL / SQLite):適合於小零件資料應用、嵌入式系統、物聯網設備。 ※ SQLite四大優點: 執行檔檔案很小:資料庫系統需要的磁碟空
Thumbnail
本文介紹了 MyISAM 和 InnoDB 儲存引擎原理的區別和比較,並從讀取效率和寫入效率、結構、任務以及操作等方面探討了兩者的差異。
※ 什麼是資料庫正規化?為什麼需要正規化? 什麼是資料庫正規化? 資料庫正規化是一種設計關聯式資料庫的方法,目的是建立良好結構的關聯表,主要目的有二: 去除重複性:建立沒有重複的關聯表。因為重複資料不只浪費資料庫的儲存空間,而且會產生資料維護上的問題。 去除不一致的相依性:資料相依是指關聯表
※ MySQL是什麼? MySQL是一種開源(免費)的關聯式資料庫管理系統,所以任何人都可以免費使用,是Web開發中最常用的資料庫之一。MySQL 會將資料儲存在由資料列與資料欄組成的資料表中。使用者可使用結構化查詢語言 (通常稱為 SQL) 來定義、操控、控管及查詢資料。  簡單來說,資料
Thumbnail
在這個星光閃爍的數據宇宙中,SQL是一把鑰匙,開啟了通往知識寶庫的大門。想像一下,每一條SELECT語句都像是一段魔法咒語,喚醒沉睡在數據庫深處的信息。今天,我們就要一起踏上這段探秘之旅,將揭開SQL基本查詢指令的神秘面紗,學習如何巧妙地與數據對話。
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為