場景:兩個用戶同時讀取了數據庫中的一條記錄,此時用戶A對其中一個字段的值進行了修改操做並進行了提交,後來用戶B也對這個字段進行了修改,用戶B的提交將會覆蓋用戶A提交的值html
關於樂觀鎖和悲觀鎖java
悲觀鎖:每次去取數據,很悲觀,都以爲會被別人修改,因此在拿數據的時候都會上鎖。sql
簡言之,共享資源每次都只給一個線程使用,其餘線程阻塞,等第一個線程用完後再把資源轉讓給其餘線程。數據庫
synchronized和ReentranLock等都是悲觀鎖思想的體現。 segmentfault
樂觀鎖:每次去取數據,都很樂觀,以爲不會被被人修改。bash
所以每次都不上鎖,可是在更新的時候,就會看別人有沒有在這期間去更新這個數據,若是有更新就從新獲取,再進行判斷,一直循環,直到拿到沒有被修改過的數據。併發
CAS(Compare and Swap 比較並交換)就是樂觀鎖的一種實現方式,好比使用version字段或者修改時間字段來判斷數據是都被修改spa
參考線程
Mysql 事務及數據的一致性處理htm
https://segmentfault.com/a/1190000012469586
CAS樂觀鎖解決併發問題的一次實踐
https://www.javazhiyin.com/41189.html
樂觀鎖與悲觀鎖——解決併發問題
https://www.cnblogs.com/0201zcr/p/4782283.html