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