9.mysql鎖機制
阿新 • • 發佈:2022-05-25
按照資料操作型別可以分為: 1.讀鎖(共享鎖):針對同一份資料,多個讀操作可以同時進行而不會相互影響 2.寫鎖(排他鎖):當前操作沒有完成前,他會阻斷其他寫鎖和讀鎖 按照對資料操作的粒度來分: 1.表鎖(偏讀):偏向MyISAM儲存引擎,開銷小,加鎖快;無死鎖鎖定粒度大,發生鎖衝突的概率最高,併發度最低 1.1【手動增加表鎖:】 lock table 表名 read(write),表名2 read(write),其他; 1.2【檢視鎖定的表和加的鎖】 show open tables; 1.3【釋放表鎖】 unlock tables; 結論: 加讀鎖 1.如果1會話給A表加了讀鎖,1會話讀取a表正常,但是不能做更新a表的操作,並且2會話的更新A表操作會進入阻塞狀態,直至表a的讀鎖去掉 2.2會話可以正常讀取加了讀鎖的a表資訊 加了寫鎖: 1.如果1會話給A表加了寫鎖,1會話對a鎖的讀取和更新均可以,但是1會話不能查詢其他表 2.2會話可以讀取更新其他表,但是不能讀取更新A表 簡而言之: 讀鎖會阻塞寫,但是不會阻塞讀 寫鎖會堵塞讀和寫 2.行鎖(偏寫):偏向於innodb儲存,開銷大,加鎖慢,會出現死鎖;鎖的粒度最小,發生鎖衝突的概率最低,併發度最高; 無索引,行鎖升級為表鎖 場景如下: 如果a欄位是int 型別,b欄位是varcahr型別,在ab欄位均建立索引 做更新操作:update 表名 set a=1 b=4000;b varcahr欄位並沒有加單引號,導致b欄位索引失效,行鎖會升級為表鎖, 這時其他程序再做更新操作會阻塞, 手動鎖定一行: select * from user where id=1 for update; 2.1間隙鎖危害 【什麼是間隙鎖:】 當我們用範圍條件而不是等值條件檢索資料,並請求共享或排他鎖時,innoDb會給複合條件的已有資料記錄的索引項加鎖; 對鍵值在條件範圍內但並不存在的記錄,叫做"間隙(GAP)" InnoDB也會對這個間隙加鎖,這種鎖機制就是所謂的間隙鎖(Next-key鎖) 【危害】 因為Query執行過程中通過範圍查詢的話,它會鎖定整個範圍內所有的索引鍵值,即使這個鍵值並不存在 間隙鎖有個致命的若覅,就是當鎖定一個範圍的鍵值之後,即使某些不存在的鍵值也會被無辜的鎖定,而做成鎖定的時候無法插入鎖定鍵值範圍內的任何資料 在某些場景下這可能會對效能造成很大的危害 2.2行鎖分析建議: 1.儘可能讓所有資料檢索都通過索引來完成,避免無索引行鎖升級為表鎖 2.合理設定索引,儘量縮小鎖的範圍 3.儘可能較少檢索條件,避免間隙鎖 4.儘量控制事務大小,減少鎖定資源和時間長度 5.儘量降低事務的隔離級別 3.頁鎖
1.間隙鎖
2.show open tables;檢視鎖定的表
3.表鎖分析
4.Innodb和MyISAM
5.行鎖分析