資料庫鎖表:在資料庫裡,同一個資料可能有多個人來讀取或更改,為了防止更改的時候別人也同時更改,這裡一般要鎖住表不讓別人改。當然還有其它各種複雜情況。
資料庫鎖從型別上講,有共享鎖,意向鎖,排他鎖。從鎖的粒度角度來說,可以分為為行、頁鍵、鍵範圍、索引、表或資料庫獲取鎖。(鎖粒度是被封鎖目標的大小,封鎖粒度小則併發性高,但開銷大,封鎖粒度大則併發性低但開銷小)
可能的原因有:
(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)只處理少量元組的使用者事務:以元組為封鎖單位
參考資料:
資料庫鎖表:在資料庫裡,同一個資料可能有多個人來讀取或更改,為了防止更改的時候別人也同時更改,這裡一般要鎖住表不讓別人改。當然還有其它各種複雜情況。
資料庫鎖從型別上講,有共享鎖,意向鎖,排他鎖。從鎖的粒度角度來說,可以分為為行、頁鍵、鍵範圍、索引、表或資料庫獲取鎖。(鎖粒度是被封鎖目標的大小,封鎖粒度小則併發性高,但開銷大,封鎖粒度大則併發性低但開銷小)
可能的原因有:
(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)只處理少量元組的使用者事務:以元組為封鎖單位
參考資料: