MySQL理論彙總大綱 鎖相關

2021-10-12 06:20:56 字數 1754 閱讀 2505

1、根據加鎖範圍分為:全域性鎖、表級鎖、行鎖

1、範圍:對整個資料庫例項加鎖。

2、mysql提供加全域性讀鎖的方法:flush tables with read lock(ftwrl)。

3、這個命令可以使整個庫處於唯讀狀態。使用該命令之後,資料更新語句、資料定義語句和更新類事務的提交語句等操作都會被阻塞。

4、使用場景:全庫邏輯備份。

5、風險

(1).如果在主庫備份,在備份期間不能更新,業務停擺。

(2).如果在從庫備份,備份期間不能執行主庫同步的binlog,導致主從延遲。

6、官方自帶的邏輯備份工具mysqldump,當mysqldump使用引數--single-transaction的時候,會啟動乙個事務,確保拿到一致性檢視。而由於mvcc的支援,這個過程中資料是可以正常更新的。

7、如果要全庫唯讀,為什麼不使用set global readonly=true的方式?

(1).在有些系統中,readonly的值會被用來做其他邏輯,比如判斷主備庫。而且修改global變數的方式影響太大。

(2).在異常處理機制上有差異。如果執行ftwrl命令之後由於客戶端發生異常斷開,那麼mysql會自動釋放這個全域性鎖,整個庫回到可以正常更新的狀態。而將整個庫設定為readonly之後,如果客戶端發生異常,則資料庫就會一直保持readonly狀態,這樣會導致整個庫長時間處於不可寫狀態,風險較高。

表鎖:1、語法是:lock tables ... read/write

2、 lock tables語法除了會限制別的執行緒的讀寫外,也限定了本執行緒接下來的操作物件。

3、可以用unlock tables主動釋放鎖,也可以在客戶端斷開的時候自動釋放         

元資料鎖(mdl鎖):

1、不需要顯式使用,在訪問乙個表的時候會被自動加上。

mdl讀鎖:

在對乙個表做增刪改查操作的時候加鎖

mdl寫鎖:

當要對錶做結構變更操作的時候加鎖

2、mdl的作用:保證讀寫的正確性。

3、讀鎖之間不互斥。讀寫鎖之間,寫鎖之間是互斥的,用來保證變更表結構操作的安全性。

4、mdl 會直到事務提交才會釋放,在做表結構變更的時候,一定要小心不要導致鎖住線上查詢和更新。

兩階段鎖:

在 innodb 事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻釋放, 而是要等到事務結束時才釋放。

建議:如果你的事務中需要鎖多個行,要把最可能造成鎖衝突、最可能影響併發度的鎖盡量往後放。

2、死鎖問題

當併發系統中不同執行緒出現迴圈資源依賴,涉及的執行緒都在等待別的執行緒釋放資源時,就會導致這幾個執行緒都進入無限等待的狀態。

解決方案:

(1)通過引數 innodb_lock_wait_timeout 根據實際業務場景來設定超時時間,innodb引擎預設值是50s。

(2)發起死鎖檢測,發現死鎖後,主動回滾死鎖鏈條中的某乙個事務,讓其他事務得以繼續執行。將引數 innodb_deadlock_detect 設定為 on,表示開啟這個邏輯(預設是開啟狀態)。

3、如何解決熱點行更新導致的效能問題?

(1)如果你能確保這個業務一定不會出現死鎖,可以臨時把死鎖檢測關閉掉。一般不建議採用

(2)控制併發度,對應相同行的更新,在進入引擎之前排隊。這樣在innodb內部就不會有大量的死鎖檢測工作了。

(3)將熱更新的行資料拆分成邏輯上的多行來減少鎖衝突,但是業務複雜度可能會提高。

4、next key lock是gap鎖和行鎖的組合

——整理自丁奇老師專欄《mysql實戰45講》

MySQL鎖相關內容

mysql的表鎖使用 lock table 表名 read write 語句來新增讀鎖或者寫鎖。通過unlock table 語句來釋放所有表鎖。在對錶加了表鎖時,這個連線就不能再操作其他表了 包括讀和寫 簡而言之,就是讀鎖會阻塞寫,但是不會阻塞讀。而寫鎖則會把讀和寫都阻塞。還有一點就是網上都說表鎖...

mysql鎖相關知識點總結

1.mysql server分為3層 服務層 核心層 查詢快取 分析器 優化器 執行器 儲存層。mysql在5.5之前預設使用myisam儲存引擎,之後使用innodb 1.mysql事務包含四個特性,號稱acid四大天王。原子性 atomicity 語句要麼全執行,要麼全不執行,是事務最核心的特性...

Mysql資料庫讀寫鎖相關

和讀鎖 寫鎖相關的場景 乙個執行緒想讀取一行資料,而且這行資料正在被修改。這時候會發生什麼?1.select from 是乙個快照讀,通過讀取資料庫的乙個快照,不會加任何鎖,除非將隔離級別設定成了 serializable 排他鎖什麼時候使用 innodb引擎的insert,update,delet...