1. 程式人生 > 其它 >9.mysql鎖機制

9.mysql鎖機制

按照資料操作型別可以分為:
    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.行鎖分析