併發問題中的悲觀鎖和樂觀鎖

2022-02-21 03:08:24 字數 802 閱讀 3270

1.悲觀鎖:很悲觀,每次去拿資料的時候都認為別人會修改,所以每次去拿資料都會「上鎖」,操作完成後再「解鎖」。在資料加鎖期間,其他人如果來拿資料就會等待,直到去掉鎖。好比搶廁所。資料庫中的悲觀鎖有「鎖表」,「鎖行」等。c#程式中有lock(obj)

2.樂觀鎖:很樂觀,認為一般情況不會被占用,自己先佔了在說,佔完後再看看是不是佔上了,如果沒有佔上就是失敗了。

兩種鎖各有優缺點。悲觀鎖體驗更好,但是對系統效能影響大,只適合併發量不大的場合。樂觀鎖適用於「寫少讀多」的情況,加大了系統吞吐量,但是「樂觀鎖可能失敗」給使用者的體驗不好。

悲觀鎖的使用 

一定要在同乙個事務中,在查詢語句的表名後加上 with(xlock,rowlock) 。 xlock表示「排他鎖」,加上排他鎖後其他人再獲得這個鎖的話就要等待開鎖(事務結束)。 rowlock為行鎖,鎖定查詢出來的行。

樂觀鎖的使用

sqlserver資料庫中有個特殊的字段型別 rowversion ,列名叫什麼無所謂,這個欄位的值不需要程式設計師維護,每次修改這行資料的時候,對應的 rowversion 都會自動變化。其他廠商的資料庫中這個欄位的資料型別是時間戳(timestamp)型別。

樂觀鎖「搶女友」的思路很簡單:搶之前查下rowversion,查出來的值是123。那更新語句就是:update t_girls set bf = 'me' where id = 1 and rowversion = 123 

更新語句多加了這個rowversion條件,執行後如果受影響的行數是0,說明rowversion變化了,剛才有人搶先了,搶女友失敗。

資料庫中rowversion型別對應 c#中資料型別是byte

悲觀鎖和樂觀鎖

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

悲觀鎖和樂觀鎖

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

悲觀鎖和樂觀鎖

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