1、悲觀鎖:認為每次對資料庫的操作(查詢、修改)都是不安全的,因此每次操作都會把這條資料鎖掉,直到本次操作完畢釋放該鎖
2、樂觀鎖:查詢資料的時候總是認為是安全的,不會鎖資料;等到更新資料的時候會判斷這個資料是否被人修改過,如果有人修改過了則本次修改失敗
個人理解:
悲觀鎖:就是在對某個資料在處理的過程中,不允許其他人或程式或執行緒修改此資料,從而保證了資料修改的獨佔和排他性。通常大多數的悲觀鎖都是通過資料庫的鎖機制來實現的,比如:
select * from table where id = '***' for update;
缺點:悲觀鎖因為獨佔和排他的特點,導致只有在事務提交以後才能被其他人(或程式或執行緒)修改。可想而知,如果併發量很大,將會導致應用程式在資料庫處理層面阻塞而變得十分緩慢,併發量嚴重降低。
樂觀鎖:每個人(或程式或執行緒)都可以去讀取並修改這個資料,但是在修改完成後,對提交才做限制,只有滿足一定條件的資料才可以被修改(提交)。樂觀鎖的實現,一般我們通過對資料庫表加乙個version欄位,當對某條記錄修改後,同時對version(old)+1,然後把看version(new)的值是否大於資料庫當前version(db)的值,如果大於則提交,否則說明其他人(或程式或執行緒)已經修改過本條資料(version是old),只能繼續讀取資料庫最新的資料重複之前的操作。
update table set name='***' ,version = version(old)+1 where version = version(old) and id='******';
比如這個sql,如果返回大於1說明資料被更新了,則說明資料從讀取出來後就沒有被其他人(或程式或執行緒)修改過,否則如果返回0,則說明,資料已經被修改。
缺點:當資料的修改操作發生的比較頻繁,樂觀鎖的效率就會很低,因為每次讀取後更新將基本上都不成功。
簡述樂觀鎖和悲觀鎖
樂觀鎖和悲觀鎖都是一種思想,並不是真實存在於資料庫中的一種機制。當認為資料被併發修改的機率比較大,需要在修改之前借助於資料庫鎖機制,先對資料進行加鎖的思想被稱為悲觀鎖,又稱pcc pessimistic concurrency control 在效率方面,處理鎖的操作會產生了額外的開銷,而且增加了死...
樂觀鎖和悲觀鎖
1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
樂觀鎖和悲觀鎖
併發衝突 在多使用者的環境下,如果使用者同時修改同乙個文件,就會造成衝突。典型的衝突有兩種 1 丟失更新 乙個使用者的更新記錄覆蓋了另乙個人的更新。如 使用者一 讀 寫 使用者二 讀 寫 那麼使用者一就把使用者二的更新覆蓋了。2 髒讀 乙個使用者更新資料未完成時,另乙個使用者就讀取資訊。使用者一 讀...