悲觀鎖和樂觀鎖的理解

2021-07-30 09:37:09 字數 459 閱讀 3955

查了一下悲觀鎖和樂觀鎖的目的主要是為了避免髒讀,看起來和oracle的預設隔離級別read-commited是衝突的。因為read-commited是可以避免髒讀的。

細想一下,果然有問題。請看髒讀的定義:

t1修改了記錄,還沒有提交,t2讀取了該記錄,t1回滾了修改。

read-commited能夠防止當前事務讀取之前事務正在修改的資料,但是不能防止它之後的事務修改當前事務正在讀的資料或者結果集。

所以悲觀鎖應該是為了避免幻想讀和不可重複讀。悲觀鎖將正在讀的資料鎖住(實現方式是select語句後面加上for update),這樣它之後的事務就不可以修改資料。

樂觀鎖和讀資料的正確性沒有關係,樂觀鎖是為了避免兩個事務同時修改同一條資料,實現方式是在目標表上增加一列來記錄版本號,每乙個修改會把版本號+1,在提交的時候判斷版本號是否小於+1後的版本號,如果不是,就知道別人修改了這條資料,進行相應的業務處理, 例如事務的回滾等。

悲觀鎖和樂觀鎖

1.悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...

悲觀鎖和樂觀鎖

前幾天有人問了我乙個問題,說如果資料庫某些操作不用事務,那麼又需要保持資料的一致性,那麼該用什麼方法替代事務。我就想到了悲觀鎖和樂觀鎖的思想,下面我解釋一下在資料庫中的悲觀鎖和樂觀鎖 1.悲觀鎖就是把資料庫的一些操作,放在事務當中,依賴資料庫的隔離級別,實現對資料修改的封鎖,這樣做資料一致性可以保持...

悲觀鎖和樂觀鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...