MySQL核心知識學習之路(4)

2022-01-11 05:29:53 字數 1966 閱讀 1104

作為乙個後端工程師,想必沒有人沒用過資料庫,跟我一起複習一下mysql吧,本文是我學習《mysql實戰45講》的總結筆記的第四篇,總結了mysql的鎖相關知識。

所謂全域性鎖,就是對整個資料庫例項加鎖,其命令為:

mysql>flush tables with

read lock;

以下該命令會簡稱為ftwrl。

釋放全域性鎖的命令為:

mysql>unlock tables;
需要注意的是:一旦加上全域性鎖,資料更新、資料定義和更新類事務都會被阻塞

典型使用場景:全庫的邏輯備份

對於全部庫都是innodb引擎的庫的話,建議使用 -single-transaction 引數,它對應用更友好。因為它基於mvcc(多版本併發控制)的支援,有自己的一致性檢視,在整個過程中資料支援正常更新。

不建議使用 set global readonly = true 的方式實現全庫唯讀,因為:

(1)修改global變數的影響面更大,某些系統可能會採用readonly作為業務引數使用。

(2)在異常處理機制上有所差異:

mysql中表級鎖有兩類:一是表鎖,二是元資料鎖。

表鎖的語法為:lock tables ... read/write

它限制了別的執行緒,也限定了本執行緒接下來的操作物件。

表鎖一般是在資料庫引擎不支援行鎖的時候才會被用到:

mysql 5.5引入了mdl,不需要顯示使用,在訪問乙個表的時候會自動被加上。

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

mdl帶來的問題:修改表結構時申請mdl寫鎖,可能會導致鎖表,後續業務操作均會阻塞。

解決辦法:安全地給小表加字段

在mysql中,行鎖是引擎層由各個引擎自己實現的,但並不是所有引擎都支援行鎖例如myisam就不支援。

事務a更新了一行,這時事務b也要更新同一行,那麼事務b需要等待事務a的操作完成後才能進行

兩階段鎖協議:在innodb的事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立即釋放,而是要等到整個事務結束時才釋放。

給我們的啟示:如果事務中需要鎖多個行,要把最可能造成鎖衝突、最可能影響併發度的鎖盡量往後放

假設這個業務涉及三個操作:從顧客 a 賬戶餘額中扣除電影票價;給影院 b 的賬戶餘額增加這張電影票價;記錄一條交易日誌。

相比較下,影院b的賬戶更容易引發併發度衝突,所以應該把第二條語句放在事務內的最後一條,比如3-1-2的順序,那麼影院賬戶餘額這一行的鎖時間就最少。

所謂死鎖,就是指當併發系統中不同執行緒出現迴圈資源依賴,各個執行緒都在等待其他執行緒釋放資源時,就會導致各個執行緒進入無線等待的狀態。

(1)直接進入等待,直到超時。通過引數 innodb_lock_wait_timeout 來設定,預設50s。

(2)發起死鎖檢測,即主動檢測是否出現死鎖,主動回滾死鎖鏈條中的某乙個事務,讓其他事務得以繼續執行。

開啟死鎖檢測:innodb_deadlock_detect=

on。

但是,主動檢測死鎖存在額外負擔:當併發執行緒數量巨大時,需要消耗大量cpu資源去做檢測,降低了事務執行效率。

那麼,如何優化?一方面,可以臨時關閉死鎖檢測(頭痛醫頭的方法,不推薦);另一方面,控制併發度(可以做客戶端併發控制,也可以做資料庫服務端併發控制,但需要mysql專家能夠修改mysql原始碼)。

林曉斌(丁奇),《mysql實戰45講》

MySQL核心知識學習之路(2)

作為乙個後端工程師,想必沒有人沒用過資料庫,跟我一起複習一下mysql吧,本文是我學習 mysql實戰45講 的總結筆記的第二篇,總結了mysql的事務隔離級別。所謂隔離,它源自於我們熟知的事務的acid四大特性之一的isolation隔離性。如果事務之間不隔離,那麼可能會發生以下幾個問題 1 髒讀...

Web Service核心知識

xml,soap和wsdl就是構成webservice平台的三大技術。xml webservice採用http協議傳輸資料,採用xml格式封裝資料,即xml中說明呼叫遠端服務物件的哪個方法,傳遞的引數是什麼,以及服務物件的返回結果是什麼。xml是webservice平台中表示資料的格式。除了易於建立...

Hadoop核心知識

一 hadoop核心 hdfs hadoop distributed file system 分布式檔案系統 用於海量資料的儲存 yarn yet another resource negotiator 資源管理排程系統,用於資源管理排程 map reduce 分布式運算框架,用於海量資料的分析 二...