mysql給函式加上鎖 MySQL (鎖篇)

2021-10-17 13:15:35 字數 2275 閱讀 4120

1、什麼是鎖?mysql 中提供了幾類鎖?

鎖是實現資料庫併發控制的重要手段,可以保證資料庫在多人同時操作時能夠正常執行。

mysql 提供了全域性鎖、行級鎖、表級鎖。其中 innodb 支援表級鎖和行級鎖,myisam 只支援表級鎖。

2、什麼是死鎖?

死鎖是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖。

3、如何處理死鎖?

(1)通過 innodblockwait_timeout 來設定超時時間,一直等待直到超時;

(2)innodb_deadlock_detect = on 開啟死鎖檢測,發現死鎖之後,主動回滾死鎖中的某乙個事務,讓其它事務繼續執行。(預設選項)

4、如何檢視死鎖?

使用命令 show engine innodb status 檢視最近的一次死鎖。

innodb lock monitor 開啟鎖監控,每 15s 輸出一次日誌。使用完畢後建議關閉,否則會影響資料庫效能。

5、如何開啟死鎖檢測?

設定 innodbdeadlockdetect 設定為 on 可以主動檢測死鎖,在 innodb 中這個值預設就是 on 開啟的狀態。

6、innodb 預設是如何對待死鎖的?

innodb 預設是使用設定死鎖時間來讓死鎖超時的策略,預設 innodblockwait_timeout 設定的時長是 50s。

7、什麼是全域性鎖?它的應用場景有哪些?

全域性鎖就是對整個資料庫例項加鎖,它的典型使用場景就是做全庫邏輯備份。 這個命令可以使整個庫處於唯讀狀態。使用該命令之後,資料更新語句、資料定義語句、更新類事務的提交語句等操作都會被阻塞。

8、如何設定資料庫為全域性唯讀鎖?

使用命令 flush tables with read lock(簡稱 ftwrl)就可以實現設定資料庫為全域性唯讀鎖。

9、使用全域性鎖會導致什麼問題?

如果在主庫備份,在備份期間不能更新,業務停擺,所以更新業務會處於等待狀態。

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

10、什麼是共享鎖?

共享鎖又稱讀鎖 (read lock),是讀取操作建立的鎖。其他使用者可以併發讀取資料,但任何事務都不能對資料進行修改(獲取資料上的排他鎖),直到已釋放所有共享鎖。

11、什麼是排它鎖?

排他鎖 (writer lock)又稱寫鎖。

若某個事物對某一行加上了排他鎖,只能這個事務對其進行讀寫,在此事務結束之前,其他事務不能對其加任何鎖,其他程序可以讀取,不能進行寫操作,需等待其釋放。

排它鎖是悲觀鎖的一種實現,

12、如何處理邏輯備份時,整個資料庫不能插入的情況?

如果使用全域性鎖進行邏輯備份就會讓整個庫成為唯讀狀態,幸好官方推出了乙個邏輯備份工具 mysqldump 來解決了這個問題。

只需要在使用 mysqldump 時,使用引數 -single-transaction 就會在匯入資料之前啟動乙個事務來保證資料的一致性,並且這個過程是支援資料更新操作的。

13、除了 ftwrl 可以設定資料庫唯讀外,還有什麼別的方法?

除了使用 ftwrl ( flush tables with read lock)外,還可以使用命令 set global readonly=true 設定資料庫為唯讀。

14、ftwrl 和 set global readonly=true 有什麼區別?

ftwrl 和 set global readonly=true 都是設定整個資料庫為唯讀狀態,但他們最大的區別就是,當執行 ftwrl 的客戶端斷開之後,整個資料庫會取消唯讀,而 set global readonly=true 會一直讓資料處於唯讀狀態。

15、innodb 儲存引擎有幾種鎖演算法?

record lock — 單個行記錄上的鎖;

gap lock — 間隙鎖,鎖定乙個範圍,不包括記錄本身;

next-key lock — 鎖定乙個範圍,包括記錄本身。

16、innodb 如何實現行鎖?

行級鎖是 mysql 中粒度最小的一種鎖,他能大大減少資料庫操作的衝突。

(1)共享鎖:

select … lock in share mode,mysql 會對查詢結果集中每行都新增共享鎖,前提是當前執行緒沒有對該結果集中的任何行使用排他鎖,否則申請會阻塞。

(2)排他鎖:

select … for update,mysql 會對查詢結果集中每行都新增排他鎖,在事物操作中,任何對記錄的更新與刪除操作會自動加上排他鎖。前提是當前沒有執行緒對該結果集中的任何行使用排他鎖或共享鎖,否則申請會阻塞。

手動給mysql表上鎖

1.mysql全域性上鎖 flush tables with read lock 這個命令是全域性讀鎖定,執行了此命令之後所有庫所有表都被鎖定唯讀。在搭建主從的時候,此命令可以很好地保證主庫狀態 執行此語句後,庫執行create語句也會等待 解鎖語句是unlock tables。flush tabl...

給 mysql 系統表加上 trigger

預設情況下,mysql 是不能給系統表,例如 mysql.user 加上觸發器的。會提示 error 1465 hy000 triggers can not be created on system tables但是還是可以有辦法繞過這個限制。在其他 db 裡另外建乙個結構名字一樣的表,例如 cre...

mysql 查詢鎖 MySQL 鎖查詢

一 從檢視檢視 檢視程序 show processlist 檢視是否鎖表 show open tables where in use 0 1 檢視當前的事務 select from information schema.innodb trx 2 檢視當前鎖定的事務 select from infor...