回覆列表
  • 1 # lanfengz3

    資料庫鎖表:在資料庫裡,同一個資料可能有多個人來讀取或更改,為了防止更改的時候別人也同時更改,這裡一般要鎖住表不讓別人改。當然還有其它各種複雜情況。

    資料庫鎖從型別上講,有共享鎖,意向鎖,排他鎖。從鎖的粒度角度來說,可以分為為行、頁鍵、鍵範圍、索引、表或資料庫獲取鎖。(鎖粒度是被封鎖目標的大小,封鎖粒度小則併發性高,但開銷大,封鎖粒度大則併發性低但開銷小)

    可能的原因有:

    (1)欄位不加索引:在執行事務的時候,如果表中沒有索引,會執行全表掃描,如果這時候有其他的事務過來,就會發生鎖表!

    (2)事務處理時間長:事務處理時間較長,當越來越多事務堆積的時候,會發生鎖表!

    (3)關聯操作太多:涉及到很多張表的修改等,在併發量大的時候,會造成大量表資料被鎖!

    出現鎖表的解決方法有:

    (1)透過相關的sql語句可以查出是否被鎖定,和被鎖定的資料!

    (2)為加鎖進行時間限定,防止無限死鎖!

    (3)加索引,避免全表掃描!

    (4)儘量順序操作資料!

    (5)根據引擎選擇合理的鎖粒度!

    (6)事務中的處理時間儘量短!

    生產中出現死鎖等問題是比較嚴重的問題,因為通常死鎖沒有明顯的錯誤日誌,只有在發現錯誤的時候才能後知後覺的處理,所以,一定要盡力避免!

    擴充套件資料:

    封鎖是指事務T在對某個資料物件(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖。加鎖後事務T就對該資料物件有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此資料物件。

    鎖表的基本型別有:

    (1)排它鎖(記為X鎖)

    排它鎖又稱為寫鎖。若事務T 對資料物件A 加上X 鎖,則只允許T 讀取和修改A , 其它任何事務都不能再對A 加任何型別的鎖,直到T 釋放A 上的鎖。 

    (2)共享鎖(記為S鎖)

    共享鎖又稱為讀鎖。若事務T 對資料物件A 加上S 鎖,則其它事務只能再對A 加S 鎖,而不能加X 鎖,直到T 釋放A 上的S 鎖。X鎖和S鎖都是加在某一個數據物件上的。

    封鎖單元有:

    封鎖的物件可以是邏輯單元,也可以是物理單元。

    邏輯單元: 屬性值、屬性值集合、元組、關係、索引項、整個索引、整個資料庫等;

    物理單元:頁(資料頁或索引頁)、塊等。

    封鎖物件可以很大也可以很小,例如對整個資料庫加鎖、對某個屬性值加鎖。封鎖物件的大小稱為封鎖的粒度。封鎖的粒度越大,系統中能夠被封鎖的物件就越少,併發度也就越小,但系統開銷也越小;封鎖的粒度越小,併發度越高,但開銷也就越大。

    選擇封鎖粒度時必須同時考慮開銷和併發度兩個因素,進行權衡,以求得最優的效果。

    一般原則為:

    (1)需要處理大量元組的使用者事務:以關係為封鎖單元;

    (2)需要處理多個關係的大量元組的使用者事務:以資料庫為封鎖單位;

    (3)只處理少量元組的使用者事務:以元組為封鎖單位

    參考資料:

  • 中秋節和大豐收的關聯?
  • 聖經人物大衛合神心意表現在哪裡?