Mysql實戰學習筆記四 鎖

2021-09-25 05:45:19 字數 1291 閱讀 1141

全域性鎖

全域性鎖就是對整個資料庫例項進行加鎖。命令為flush tables with read lock。執行後整個庫處於唯讀狀態,資料增刪改語句,資料定義語句(建表,修改表結構)和更新類事務提交都會被阻塞。

全域性鎖常用於myisam資料庫的備份,加上唯讀鎖之後備份。

但是整個庫唯讀存在風險。

使用全域性鎖備份的風險

但是不加鎖的話,如果在備份期間,資料進行修改,就會導致資料不一致問題。原庫修改了,備份庫沒改。

保證資料一致的乙個辦法是在可重複度隔離級別開啟乙個事務。

mysqldump -single-transaction,導資料之前就會啟動乙個事務,確保拿到一致性檢視,由於mvcc的支援,這個過程中資料時可以正常更新的。

但是single-transaction方法只適用於所有的表使用事務引擎的庫。所以myisam只能使用ftwrl。

為什麼不使用set global readonly =true 而是ftwrl

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

表鎖的用法是lock tables … read/write.可以使用unlock tables 主動釋放,也可以在客戶端斷開的時候自動釋放。

mdl不需要顯式呼叫,在訪問乙個表的時候會自動加上。mdl是為了保證讀寫的正確性。比如查詢的時候鎖住表,不讓其他執行緒修改表結構。

當對乙個表做dml時, 加上mdl讀鎖。當對乙個表做ddl時,加mdl寫鎖。

進行上圖操作時,ab正常執行,c被鎖住,因為a讀鎖還沒有釋放,d因為c被阻塞所以自己也被阻塞。

由此可以看出mdl鎖是事務提交之後才釋放的。

正確的做法應該是 在alter table 裡設定等待時間,如果在這個時間裡能夠拿到mdl寫鎖最好,如果不能也不要阻塞後面的業務語句先放棄。然後再重試。

行鎖innodb支援行鎖,myisam不支援,只支援到表鎖。因此業從務併發度方面來看,innodb表現更優秀一些。

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

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

因為往後放的話離事務提交的時間就越短,即離釋放鎖的時間越短,堵塞的時間越短。

題外ddl 資料庫定義語言 (修改表字段,建表等)

dml 資料操作語言 (增刪改查)

MySQL學習筆記 鎖

macbook pro mysql技術內幕innodb儲存引擎 第二版 資料庫中最大的難點 一方面需要最大程度地利用資料庫的併發訪問,另外一方面還要確保每個使用者能以一致的方式讀取和修改資料。因此就有了鎖的機制。q innodb儲存引擎為什麼乙個鎖和多個鎖的開銷是相同。a lock的物件是事務,用來...

MySQL實戰之鎖

來自極客時間,林曉斌 丁奇 的mysql實戰45講 全域性鎖就是對整個資料庫例項加鎖。mysql 提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock ftwrl 當你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞 應用場景 ...

MySQL學習筆記 四

上篇我們學會了如何建立乙個資料庫和資料庫表,並知道如何向資料庫表中新增記錄。那麼我們如何從資料庫表中檢索資料呢?1 從資料庫表中檢索資訊 實際上,前面我們已經用到了select語句,它用來從資料庫表中檢索資訊。select語句格式一般為 以前所使用的 表示選擇所有的列。2 查詢所有資料 mysql ...