樂觀鎖 悲觀鎖

2022-06-18 06:45:10 字數 828 閱讀 3291

a執行緒查詢時加鎖-----處理-------更新資料,

b執行緒進來時也進行:查詢時加鎖(這裡會等待)-----處理-------更新資料,

a執行緒:查詢資料(查版本號)--處理---更新(判斷版本號與資料庫是否一致,不一致返回錯誤不更新)

update version=version+1 where a=? and version=lastversion 如果找不到說明version被其它執行緒改了,所以不允許操作,回到第一步重新查詢處理

b執行緒:查詢資料(查版本號)--處理---更新(判斷版本號與資料庫是否一致,不一致返回錯誤不更新)

兩種方式都能解決併發髒資料問題,如果更新多,更新衝突多,如果用樂觀鎖會一直返回錯誤retry,所以要用悲觀鎖。如果更新少,用樂觀鎖

引用知乎上面的回答:

寫寫衝突的處理流程。一般是以讀寫衝突的處理來說明mvcc的優點。比如對於資料項a,它的資料版本為a1->a2->a3,最新版本是a3。如果事務x在讀寫資料項a時,a1和a2已提交的,事務y正在修改a3,那麼a3可以被提交,也可能被回滾。在使用鎖協議時,事務x要等待y結束,才能判斷是否讀到a3。在mvcc中,事務x可以讀取已經提交的a2,而不必等待a3。這麼操作邏輯上是合理的,因為事務x讀到了乙個最新的已經提交資料,這不會帶來資料不一致,也避免了讀寫操作的衝突等待。在上面的情況中,x可以讀到a2,如果x要寫a怎麼辦?從邏輯上說,a3不確定是提交還是回滾,x必須等待y結束,才能開始寫操作,因此mvcc的寫寫操作是需要在資料物件上加寫鎖的,因此對於同一資料物件的寫寫操作,mvcc也是序列執行的。由於實際業務中讀操作事務數量要大於寫操作事務,mvcc讀寫不衝突(不加鎖),寫寫衝突(加做)的機制,能夠提高讀事務的執行效能,從而提高系統的整體效能。

悲觀鎖樂觀鎖

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

樂觀鎖 悲觀鎖

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

樂觀鎖 悲觀鎖

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