日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

乐观锁与悲观锁各自适用场景是什么?

發布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 乐观锁与悲观锁各自适用场景是什么? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

機制

  • 樂觀鎖是一種思想,具體實現是,表中有一個版本字段,第一次讀的時候,獲取到這個字段。處理完業務邏輯開始更新的時候,需要再次查看該字段的值是否和第一次的一樣。如果一樣更新,反之拒絕。之所以叫樂觀,因為這個模式沒有從數據庫加鎖。

  • 悲觀鎖是數據庫層面加鎖,都會阻塞去等待鎖。樂觀鎖優點程序實現,不會存在死鎖等問題。他的適用場景也相對樂觀。阻止不了除了程序之外的數據庫操作。悲觀鎖是數據庫實現,他阻止數據庫寫操作。再來說更新數據丟失,所有的讀鎖都是為了保持數據一致性。樂觀鎖如果有人在你之前更新了,你的更新應當是被拒絕的,可以讓用戶從新操作。悲觀鎖則會等待前一個更新完成。這也是區別。具體業務具體分析

  • 實現方式

    樂觀鎖,version方式:一般是在數據表中加上一個數據版本號version字段,表示數據被修改的次數,當數據被修改時,version值會加一。當線程A要更新數據值時,在讀取數據的同時也會讀取version值,在提交更新時,若剛才讀取到的version值為當前數據庫中的version值相等時才更新,否則重試更新操作,直到更新成功。sql實現代碼:

    update?table? set?x=x+1,?version=version+1? where?id=#{id}?and?version=#{version};CAS操作方式:即compare and swap 或者 compare and set,

    涉及到三個操作數,數據所在的內存值,預期值,新值。當需要更新時,判斷當前內存值與之前 取到的值是否相等,若相等,則用新值更新,若失敗則重試,一般情況下是一個自旋操作,即不 斷的重試。

    悲觀鎖,是由數據庫自己實現的,要用的時候,我們直接調用數據庫的相關語句就可以了(原理:共享資源每次只給一個線程使用,其它線程阻塞,用完后再把資源轉讓給其它線程),如行鎖、讀鎖和寫鎖等,都是在操作之前加鎖。

    使用場景

    樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,數據發生沖突的可能性就會增大,為了保證數據的一致性,應用層需要不斷的重新獲取數據,這樣會增加大量的查詢操作,降低了系統的吞吐量。

    悲觀鎖:比較適合寫入操作比較頻繁的場景,如果出現大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。

    總結

    以上是生活随笔為你收集整理的乐观锁与悲观锁各自适用场景是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。