面對高併發加鎖可以從兩種層面來考慮:
下面介紹:樂觀鎖、悲觀鎖(共享鎖s和排他鎖x)區別
1.樂觀鎖
從上面的例子可以看出,樂觀鎖機制避免了長事務中的資料庫加鎖開銷(操作員 a和操作員 b 操作過程中,都沒有對資料庫資料加鎖),大大提公升了大併發量下的系統整體效能表現。 需要注意的是,樂觀鎖機制往往基於系統中的資料儲存邏輯,因此也具備一定的侷限性。
2.悲觀鎖
共享鎖和排他鎖:
共享鎖(s鎖)和排它鎖(x鎖)
死鎖的產生原理:因為共享鎖可以被多個事物同時施加所以才會產生死鎖產生
避免死鎖:
解除死鎖:
事物的四種隔離級別
1、read uncommitted:對資料進行行級加鎖(行級鎖)
2、read committed :對資料進行行級加鎖(行級鎖)
3、repeated read :對資料進行行級加鎖(行級鎖)
4、serializable:對資料進行表級加鎖(表級鎖)
由於程式只要對資料庫資料進行操作,包括讀取操作都是必須要先對操作的資料進行加鎖之後才能操作,所以資料庫的隔離級別機制原理就是通過對資料進行加不同的鎖來操作的
不過我們需要注意的是一些鎖的級別,mysql的myisam儲存引擎使用的是表所,innodb預設使用行級鎖,但是行級鎖是基於索引的,如果一條sql語句用不到索引是不會使用行級鎖的,會使用表級鎖把整張表鎖住,這點需要注意(這也是為什麼資料庫欄位加索引會對資料操作效率高的乙個因素),
還有就是行級鎖別不是直接鎖資料而是鎖索引,索引分為主鍵索引和非主鍵索引兩種,如果一條sql 語句操作了主鍵索引,mysql 就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,mysql會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。
innodb 行鎖是通過給索引項加鎖實現的,如果沒有索引,innodb 會通過隱藏的聚簇索引來對記錄加鎖。也就是說:如果不通過索引條件檢索資料,那麼innodb將對錶中所有資料加鎖,實際效果跟表鎖一樣。因為沒有了索引,找到某一條記錄就得掃瞄全表,要掃瞄全表,就得鎖定表。
例如:user表有主鍵索引id和name兩個屬性,那麼
select * from id=***(使用到了索引所以只會對id為***的索引進行行級加鎖)
select * from name=***(沒有使用到索引,會對整張user表加鎖)
附:
資料庫隔離機制的實現
資料庫隔離機制的實現 總結糾正個問題 資料資料庫隔離機制 序列化可重複讀 讀已提交 讀未提交 資料庫事務可能導致的問題 髒讀不可重複讀幻讀 髒讀 事務a,先執行,處於未提交的狀態 insert into table values 1,xx 事務b,後執行,也未提交 select from table...
資料庫事物 隔離等級及資料庫鎖機制
事務 transaction 是資料庫管理系統的執行單位,可以是乙個資料庫操作 如select操作 或者是一組操作序列。事務acid屬性,即原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性 atomic 保證事務中的所有操作...
hibernate之資料庫隔離機制與鎖
hibernate之資料庫隔離機制與鎖 長久以來,對資料庫的各種隔離機制一直很模糊,總搞不清楚在別人眼裡很簡單的鎖機制,事務隔離機制,最近查了一些資料,把自己對資料庫的一些理解寫下來,權當筆記,不對的地方希望大家指正。為了確保併發使用者在訪問同一資料庫物件時的正確性 即無丟失修改 可重複讀 不讀 髒...