作為乙個後端工程師,想必沒有人沒用過資料庫,跟我一起複習一下mysql吧,本文是我學習《mysql實戰45講》的總結筆記的第四篇,總結了mysql的鎖相關知識。
所謂全域性鎖,就是對整個資料庫例項加鎖,其命令為:
mysql>flush tables with以下該命令會簡稱為ftwrl。read lock;
釋放全域性鎖的命令為:
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=但是,主動檢測死鎖存在額外負擔:當併發執行緒數量巨大時,需要消耗大量cpu資源去做檢測,降低了事務執行效率。on。
那麼,如何優化?一方面,可以臨時關閉死鎖檢測(頭痛醫頭的方法,不推薦);另一方面,控制併發度(可以做客戶端併發控制,也可以做資料庫服務端併發控制,但需要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 分布式運算框架,用於海量資料的分析 二...