1. 程式人生 > 其它 >java的訪問許可權protected和default

java的訪問許可權protected和default

mysql鎖

1.鎖概述

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。

在資料庫中,除傳統的計算資源(如CPU、EAM、I/O等)的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性、有效性是所有資料庫必須解決的一個問題,鎖衝突也是影響資料庫併發訪問效能的一個重要因素。從這個角度來說,鎖對資料庫而言顯得尤其重要,也更復雜。

2.鎖分類

  • 對資料操作的粒度分:

    • 表鎖:操作時,會鎖整個表

    • 行鎖:操作時,會鎖定當前操作行

  • 從對資料操作的型別分:

    • 讀鎖(共享鎖):針對同一份資料,多個讀操作可以同時進行而不會互相影響。

    • 寫鎖(排它鎖):當前操作沒有完成之前,它會阻斷其他寫鎖和讀鎖。

3.myisam表鎖

myisam儲存引擎只支援表鎖,這也是mysql開始幾個版本唯一支援的鎖型別

  • 如何加表鎖

    • myisam在執行select前,會自動給涉及到的表加讀鎖,執行update、delete、insert前,會自動加寫鎖,這個過程不需要使用者干預,因此,使用者一般不需要用loca table命令給myisam表顯式加鎖。


      加讀鎖: lock table user read;
      加寫鎖:lock table user write;
      解鎖:unlock tables;
  • 讀鎖會阻塞其他執行緒的寫操作,自己的寫操作會報錯

  • 寫鎖會阻塞其他執行緒的讀寫操作

  • myisam的讀寫鎖排程是寫優先,開啟寫鎖後其他執行緒不能做任何操作,大量的跟新會使查詢很難得到鎖,從而造成永久阻塞。

  • 檢視鎖的爭用情況


    show open tables;

    in_user:表示當前這個表被使用的次數。如果為0,則表是開啟的,但是當前沒有被使用。

    name_locked:表名稱是否被鎖定。名稱鎖定用於取消表或對錶進行重新命名等操作。


    show status like 'Table_locks%';

    table_locks_immediate:指的是能夠立即獲得表級鎖的次數,每立即獲取鎖,值加1.

    table_locks_waited:指的是不能立即獲取表級鎖而需要等待的次數,每等待一次,值加1,此值越高說明存在著較為嚴重的表級鎖爭用情況。

4.innodb行鎖

行鎖特點:偏向innodb儲存引擎,開銷大,加鎖慢;會出現死鎖;鎖的粒度小,發生鎖衝突的概率最低,併發度也最高。innodb與myisam的最大不同有兩點:一是支援事務;二是採用了行級鎖。

  • 事務及其ACID屬性

    • 事務是由一組SQL語句組成的邏輯處理單元。

    • 事務具有以下4個特性,簡稱為事務ACID屬性。

      ACID屬性 含義
      原子性(Atomiity) 事務是一個原子操作單元,其對資料的修改,要麼全部成功,要麼全部失敗。
      一致性(Consistent) 在事務開始和完成時,資料都必須保持一致狀態。
      隔離性(Isolation) 資料庫系統提供了一定的隔離機制,保證事務在不受外部併發操作影響的“獨立”環境下執行
      永續性(Durable) 事務完成之後,對於資料的修改時永久的。
  • 併發事務處理帶來的問題

    問題 含義
    丟失更新(lost update) 當兩個或多個事務選擇同一行,最初的事務修改的值,會被後面的事務修改的值覆蓋。
    髒讀(Dirt reads ) 當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。
    不可重複讀(Non-Repeatable Reads) 一個事務在讀取某些資料後的某個時間,再次讀取以前讀過的資料,卻發現和以前讀出的資料不一致。
    幻讀(Phantom Reads) 一個事務按照相同的查詢條件重新讀取以前查詢過的資料,卻發現其他事務插入了滿足其查詢條件的新資料。
  • 資料庫隔離級別

    隔離級別 丟失更新 髒讀 不可重複讀 幻讀
    Read uncommitted x
    Read committed x x
    Repeatable read(預設) x x x
    Serializable x x x x

    備註:√代表可能出現,x代表不會出現

    Mysql預設的資料庫隔離級別為Repeatable read


    show variables like 'tx_isolation'
  • innodb的行鎖模式(where條件用了非索引欄位鎖為表鎖)

    • 共享鎖(S):又稱為讀鎖,簡稱S鎖,共享鎖就是多個事務對於同一個資料可以共享一把鎖,都能訪問到資料,但是隻能讀不能修改。

    • 排他鎖(X):又稱為寫鎖,簡稱X鎖,排他鎖就是不能與其他鎖共存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務是可以對資料進行讀取和修改。

    • 對於update、delete、insert語句,innodb會自動給設計資料集加排他鎖(X);

    • 對於普通select語句,innodb不會加任何鎖;


      共享鎖(S):select * from user where ... lock in share mode
      排他鎖(x):select * from user where ... for update
  • 間隙鎖

    當我們用範圍條件,而不是使用相等條件檢索資料,並請求共享或排他鎖時,innodb會給符合條件的已有資料進行加鎖;對於鍵值在條件範圍內但並不存在的記錄,叫做“間隙(CAP)”,innoDB也會對這個“間隙”加鎖,這種鎖機制就是所謂的間隙鎖(Next-key鎖)。


    查詢到資料id為 1 2 5 7 8符合條件
    本質會對 1 2 3 4 5 6 7 8 的資料進行加鎖,實際上並沒有3 4 6 的資料,插入3 4 6 會被鎖住。

    間隙鎖的出現是為了在innodb的可重複讀隔離級別下,解決幻讀問題產生的。

  • 優化建議:

    • 儘可能讓所有資料檢索都通過索引來完成,避免無索引行鎖升級為表鎖。

    • 合理設計索引,儘量縮小鎖的範圍

    • 儘可能減少索引條件,及索引範圍,避免間隙鎖

    • 儘量控制事務大小,減少鎖定資源量和時間長度

    • 儘可能使用低級別事務隔離級別(但是需要業務層面滿足需求)

    •