產生的原因
事務訪問資料時會自動加mdl鎖,也就是元資料讀鎖。這個事務訪問資料不是當前讀,不是forupdate,只是普通的select。
事務修改元資料的時候,會自動給表加mld寫鎖。也就是加寫鎖,別的表都不能訪問該錶資料了。
在專案大規模上線改表的時候,有時候會給**下線,上線成功後才會開啟。
舉例:下面四個事務a、b、c、d,a只是簡單的快照讀,不加任何行鎖和表鎖,但是會加mdl讀鎖,加鎖後會禁止一切事務修改表資料的,等事務提交後才能動表資料。這時候 事務b修改表了,這時候要獲取mdl寫鎖,因為mdl寫鎖和mdl讀鎖是互斥的,所以要獲取mdl寫鎖的b會阻塞等待;這時候事務c查表,按理說應該是mdl讀鎖,在此之前事務a也是mdl讀鎖,事務c也能往上加mdl讀鎖,但是mdl鎖假如有鎖等待,兩種鎖不相容那麼會自動成乙個佇列,但是在事務c之前有乙個事務b,所以加不上,及時和事務a的mdl鎖是相容的也加不上,事務d也等著加mdl讀鎖,就是因為事務b不相容,所以加不上。
解決辦法
檢視長事務
alter table之前檢視是否有長事務還未提交,首先不要在業務高峰期做,如果前面有長事務沒提交,那麼你這時候要獲取mdl寫鎖,那麼這時候後面所有讀的都被阻塞了,如果不加寫鎖,後面的讀會相容的。
檢視長事務:information_schema庫innodb_trx表,有事務號、事務開啟時間等,觀察事務的長短。
如何檢視影響效能的鎖
檢視所有鎖:information_schema庫的innodb_locks表,有關行鎖和其他鎖的問題,鎖的記錄,看哪些鎖時間長,哪些鎖有問題。
檢視阻塞的事務:information_schema庫innodb_lock_waits表,影響效能的阻塞問題
mysql 8.0新增
performance_schema庫data_locks表
performance_schema庫data_lock_waits表,有關阻塞的問題
檢視mdl鎖:performance_schema庫metadata_locks表,在alter表的之前先看看這個表
業務上盡量不開啟事務,也盡量不要長事務
資料修改(當前讀)時候盡量放在事務後,降低鎖時間
MDL了解一下
在 mysql 5.5 版本中引入了 mdl,當對乙個表做增刪改查操作的時候,加 mdl 讀 鎖 當要對錶做結構變更操作的時候,加 mdl 寫鎖。因此,如果有兩個線 程要同時給乙個表加字段,其中乙個要等另乙個執行完才能開始執行。雖然 mdl 鎖是系統缺省會加的,但卻是你不能忽略的乙個機制。比如下面這...
Lock鎖子類了解一下
回顧前面 只有光頭才能變強!那麼接下來我們就開始吧 來總結一下要點吧 class x finally 首先我們可以看到有三個內部類 這些內部類都是aqs的子類,這就印證了我們之前所說的 aqs是reentrantlock的基礎,aqs是構建鎖 同步器的框架 嘗試獲取鎖,獲取失敗的話就呼叫aqs的ac...
Lock鎖子類了解一下
回顧前面 只有光頭才能變強!那麼接下來我們就開始吧 來總結一下要點吧 class x finally 首先我們可以看到有三個內部類 這些內部類都是aqs的子類,這就印證了我們之前所說的 aqs是reentrantlock的基礎,aqs是構建鎖 同步器的框架 嘗試獲取鎖,獲取失敗的話就呼叫aqs的ac...