資料庫封鎖
『壹』 資料庫中x封鎖與s封鎖有什麼區別
資料庫中X封鎖和S封鎖的區別如下:
1、兩種封鎖共享上的區別:
排它鎖(記為X鎖),又叫寫鎖;共享鎖(記為S鎖),又叫讀鎖。讀鎖是共享的,或者說是相互不阻塞的。寫鎖是排他的,一個寫鎖會阻塞其他的寫鎖和讀鎖。
2、讀取許可權上的區別:
若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。
3、修改許可權上的區別
若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
(1)資料庫封鎖擴展閱讀:
資料庫中封鎖的對象:
封鎖是實現並發控制的一個非常重要的技術。DBMS通常提供了多種類型的封鎖。一個事務對某個數據對象加鎖後究竟擁有什麼樣的控制是由封鎖的類型決定的。
封鎖的對象可以是邏輯單元,也可以是物理單元。邏輯單元: 屬性值、屬性值集合、元組、關系、索引項、整個索引、整個資料庫等;物理單元:頁(數據頁或索引頁)、塊等。
封鎖對象可以很大也可以很小,例如對整個資料庫加鎖、對某個屬性值加鎖。封鎖對象的大小稱為封鎖的粒度。封鎖的粒度越大,系統中能夠被封鎖的對象就越少,並發度也就越小,但系統開銷也越小;封鎖的粒度越小,並發度越高,但開銷也就越大。
參考資料來源:網路-封鎖
『貳』 都有什麼情況會導致資料庫鎖表呢
資料庫鎖表:在資料庫里,同一個數據可能有多個人來讀取或更改,為了防止更改的時候別人也同時更改,這里一般要鎖住表不讓別人改。當然還有其它各種復雜情況。
資料庫鎖從類型上講,有共享鎖,意向鎖,排他鎖。從鎖的粒度角度來說,可以分為為行、頁鍵、鍵范圍、索引、表或資料庫獲取鎖。(鎖粒度是被封鎖目標的大小,封鎖粒度小則並發性高,但開銷大,封鎖粒度大則並發性低但開銷小)
可能的原因有:
(1)欄位不加索引:在執行事務的時候,如果表中沒有索引,會執行全表掃描,如果這時候有其他的事務過來,就會發生鎖表!
(2)事務處理時間長:事務處理時間較長,當越來越多事務堆積的時候,會發生鎖表!
(3)關聯操作太多:涉及到很多張表的修改等,在並發量大的時候,會造成大量表數據被鎖!
出現鎖表的解決方法有:
(1)通過相關的sql語句可以查出是否被鎖定,和被鎖定的數據!
(2)為加鎖進行時間限定,防止無限死鎖!
(3)加索引,避免全表掃描!
(4)盡量順序操作數據!
(5)根據引擎選擇合理的鎖粒度!
(6)事務中的處理時間盡量短!
生產中出現死鎖等問題是比較嚴重的問題,因為通常死鎖沒有明顯的錯誤日誌,只有在發現錯誤的時候才能後知後覺的處理,所以,一定要盡力避免!
(2)資料庫封鎖擴展閱讀:
封鎖是指事務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)只處理少量元組的用戶事務:以元組為封鎖單位