MYSQL日誌 MySQL InnoDB及MyISAM 行鎖,表鎖,間隙鎖

 

Bin log 二進制日誌  備份  增量備份 DDL DML DCL

Erro Log 錯誤日誌   排錯  

Relay Log 中繼日誌  複製 接收relication master

Slow query  Log 慢查詢日誌

Redo Log 重做日誌

什麼時候產生:
  事務開始之後就產生redo log,redo log的落盤並不是隨着事務的提交才寫入的,而是在事務的執行過程中,便開始寫入redo log文件中。
什麼時候釋放:
  當對應事務的髒頁寫入到磁盤之後,redo log的使命也就完成了,重做日誌佔用的空間就可以重用(被覆蓋)。

事務開始之後就產生redo log,redo log的落盤並不是隨着事務的提交才寫入的,而是在事務的執行過程中,便開始寫入redo log文件中。

即使某個事務還沒有提交,Innodb存儲引擎仍然每秒會將重做日誌緩存刷新到重做日誌文件。

Undo Log 回滾日誌


保存了事務發生之前的數據的一個版本,可以用於回滾,同時可以提供多版本併發控制下的讀(MVCC)

什麼時候產生:
  事務開始之前,將當前是的版本生成undo log,undo 也會產生 redo 來保證undo log的可靠性

什麼時候釋放:
  當事務提交之後,undo log並不能立馬被刪除,
  而是放入待清理的鏈表,由purge線程判斷是否由其他事務在使用undo段中表的上一個事務之前的版本信息,決定是否可以清理undo log的日誌空間。

兩階段提交

MySQL通過兩階段提交過程來完成事務的一致性的,也即redo log和binlog的一致性的,理論上是先寫redo log,再寫binlog,兩個日誌都提交成功(刷入磁盤),事務纔算真正的完成。

表鎖

偏向MyISAM存儲引擎,開銷小,加鎖快;無死鎖;鎖定粒度大,併發度低;

show open tables;

手動鎖表:

lock table jeuc read(讀共享鎖:可讀自己,不可修改自己,不可讀別的表) ;

讀鎖:讀共享鎖:當前Session1可讀自己,Session1不可修改自己,Session1不可讀別的表;Session2 可讀取,Session2修改操作在當前Session1解鎖期間,處於阻塞狀態。

lock table jeuc write(獨佔鎖);

寫鎖:當前Session1可讀自己,Session1可修改自己,Session1不可讀別的表;Session2 ,Session2 在當前Session1解鎖期間,讀寫都處於阻塞狀態。

手動釋放表:

unlock tables;

總之:對MyISAM讀鎖會阻塞寫,不會阻塞讀。寫鎖會把讀寫都阻塞。

show STATUS LIKE 'table%';

行鎖

偏向innodb存儲

索引失效行鎖變表鎖 

間隙鎖 

範圍查詢,InnoDB會給符合條件的已有數據的索引項加鎖,對於在範圍條件內但並不存在的記錄,叫做間隙鎖。即使鍵值不存在。

參考:https://zhuanlan.zhihu.com/p/86538338

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章