日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

乐观锁的两种实现方式

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

什么場景下需要使用鎖?

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

鎖的實(shí)現(xiàn)方式

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

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

總結(jié)

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

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