MySQL全局鎖和表鎖

MySQL全局鎖和表鎖

全局鎖

  對整個數據庫加鎖,語句爲:Flush tables with read lock (FTWRL),加鎖之後不可以進行增刪改,也不能做DDL,是一個整庫只讀的狀態,一般只有在做全庫邏輯備份時才需要全局鎖。可以看到,如果採用這種方式對庫加鎖的話,雖然保證了一致性,但十分影響業務。所以,應該儘量少採用這種方法,在數據的隔離級別中,可重複讀也保證了在一個事務中所看到的數據是一致的,MySQL官方提供的mysqldump工具中就提供了–single-transaction參數實現一致性讀,但是注意,這是需要存儲引擎支持的~,對於MyISAM引擎還是隻能採用上面的全局鎖,全局鎖的核心思想上是讓數據庫只讀,也可以通過set global readonly=true命令來實現(但是這個命令影響範圍更大,且客戶端異常時並不會自動釋放只讀狀態)。

表鎖

  一共分爲兩種:表鎖和元數據鎖(MDL)
  表鎖:lock tables +表名 read/write
  元數據鎖:無需顯式使用,自動加上,分爲MDL讀鎖、MDL寫鎖,讀鎖之間可以共享,讀鎖與寫鎖互斥,寫鎖之間也互斥。事務中的MDL鎖,在語句執行開始時申請,但是語句結束後並不會馬上釋放,而會等到整個事務提交後再釋放
在對錶結構進行修改時,要十分小心,要先查看是否有長事務,先kill掉,否則有可能阻塞住表上的查詢。爲了避免這一問題,可以在alter t上增加時間限制ALTER TABLE tbl_name NOWAIT add column ...ALTER TABLE tbl_name WAIT N add column ...

參考文獻

MySQL實戰45講

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