全域性鎖 表鎖和行鎖

2021-09-20 09:55:03 字數 1116 閱讀 8282

全域性鎖就是對整個資料庫例項加鎖,mysql提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock。讓你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞:

a、資料更新語句

b、資料定義語句

c、更新類事務的提交語句

mysql裡面表級別的鎖有兩種:一種是表鎖,一種是元資料鎖

表鎖的語法是lock tables …read/write,與ftwrl類似,可以用unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放。需要注意,lock tables語法除了會限制別的執行緒的讀寫外,也限定了本執行緒接下來的操作物件。

1、行鎖就是針對資料表中行記錄的鎖,比如事務a更新了一行,而這時候事務b也要更新一行,則必須等事務a的操作完成後才能進行更新。

2、舉例如下所示:

這個問題的結論取決於事務a在執行完兩條update語句後,持有哪些鎖,以及在什麼時候釋放,實際上事務b的update語句會被阻塞,直到事務a執行commit後,事務b才能繼續執行。依舊是說,行鎖是在需要的時候才加上的,但並不是不需要了就立刻釋放,而是要等事務結束時才釋放,這個就是兩階段鎖協議。

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

2、死鎖的示例很簡單:

此時,事務a在等待事務b釋放id=2的行鎖,而事務b在等待事務a釋放id=1的行鎖。事務a和事務b在互相等待對方的資源釋放,就是進入了死鎖狀態。當出現死鎖以後,有兩種策略:

a、一種策略是,直接進入等待,直至超時。這個超時時間可以通過引數innodb_lock_wait_timeout來設定

b、另一種策略是,發起死鎖檢測,發現死鎖後,主動回滾死鎖鏈條中的某乙個事務,讓其他事務得以繼續執行,將引數innodb_deadlock_detect設定為on,表示開啟這個邏輯

其實針對這種死鎖出現的情況,最好還是從業務邏輯方面來進行處理。

3 全域性鎖 表鎖 行鎖,死鎖

對整個資料庫例項加鎖。mysql提供加全域性讀鎖的方法 flush tables with read lock ftwrl 這個命令可以使整個庫處於唯讀狀態。使用該命令之後,資料更新語句 資料定義語句和更新類事務的提交語句等操作都會被阻塞。可以用unlock tables主動釋放鎖 1.如果在主庫備...

MySQL 全域性鎖 表鎖以及行鎖

mysql 5.7.25 ubuntu 16.04 全域性鎖即對整個資料庫例項加鎖,使得整個庫處於唯讀狀態,會阻塞dml和ddl語句。使用如下命令 簡稱ftwrl 可為資料庫加全域性鎖 flush tables with read lock 釋放全域性鎖命令如下 unlock tables 此外,在...

表鎖和全域性鎖

目錄 鎖的作用 處理併發問題 鎖的分類 全域性鎖表級鎖 行鎖 命令 flush tables with read lock ftwrl 這個庫處理唯讀狀態 全庫邏輯備份問題 1 主庫備份,業務停擺 2 從庫備份,不能執行binlog,導致主從延遲 在不支援事物的引擎下可以使用 有事務機制的備份 my...