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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

乐观锁的两种实现方式

發(fā)布時間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 乐观锁的两种实现方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么場景下需要使用鎖?

在多節(jié)點部署或者多線程執(zhí)行時,同一個時間可能有多個線程更新相同數(shù)據(jù),產(chǎn)生沖突,這就是并發(fā)問題。這樣的情況下會出現(xiàn)以下問題: 更新丟失:一個事務更新數(shù)據(jù)后,被另一個更新數(shù)據(jù)的事務覆蓋。 臟讀:一個事務讀取另一個事物為提交的數(shù)據(jù),即為臟讀。 其次還有幻讀。。 針對并發(fā)引入并發(fā)控制機制,即加鎖。 加鎖的目的是在同一個時間只有一個事務在更新數(shù)據(jù),通過鎖獨占數(shù)據(jù)的修改權(quán)。

鎖的實現(xiàn)方式

1、悲觀鎖,前提是,一定會有并發(fā)搶占資源,強行獨占資源,在整個數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。 2、樂觀鎖,前提是,不會發(fā)生并發(fā)搶占資源,只有在提交操作的時候檢查是否違反數(shù)據(jù)完整性。只能防止臟讀后數(shù)據(jù)的提交,不能解決臟讀。 當然,還有其他的鎖機制,暫時不多介紹,著重于樂觀鎖的實現(xiàn)。 樂觀鎖,使用版本標識來確定讀到的數(shù)據(jù)與提交時的數(shù)據(jù)是否一致。提交后修改版本標識,不一致時可以采取丟棄和再次嘗試的策略。 記錄1,id,status1,status2,stauts3,version,表示有三個不同的狀態(tài),以及數(shù)據(jù)當前的版本 操作1:update table set status1=1,status2=0,status3=0 where id=111; ? 操作2:update table set status1=0,status2=1,status3=0 where id=111; 操作3:update table set status1=0,status2=0,status3=1 where id=111; 沒有任何控制的情況下,順序執(zhí)行3個操作,最后前兩個操作會被直接覆蓋。 加上version字段,每一次的操作都會更新version,提交時如果version不匹配,停止本次提交,可以嘗試下一次的提交,以保證拿到的是操作1提交后的結(jié)果。 這是一種經(jīng)典的樂觀鎖實現(xiàn)。 另外,java中的compareandswap即cas,解決多線程并行情況下使用鎖造成性能損耗的一種機制。 CAS操作包含三個操作數(shù),內(nèi)存位置(V),預期原值(A)和新值(B)。如果內(nèi)存位置的值與預期原值相匹配,那么處理器會西東將該位置值更新為新值。否則,處理器不做任何操作。 記錄2: id,stauts,status 包含3種狀態(tài)值 1,2,3 操作,update status=3 where id=111 and status=1; 即 如果內(nèi)存值為1,預期值為1,則修改新值。對于沒有執(zhí)行的操作則丟棄。 思考:這兩種方式有什么區(qū)別?

轉(zhuǎn)載于:https://www.cnblogs.com/ywfblogs/p/9679824.html

總結(jié)

以上是生活随笔為你收集整理的乐观锁的两种实现方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。