色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

java為何會產生臟數據?

林子帆2年前15瀏覽0評論

什么是臟數據,臟數據就是過期的數據;

為什么會出現臟數據,根本原因還是數據沒有同步,歸根結底其實就是數據一致性問題,怎么保證數據的一致性這本身就是一個難題;我們平時會遇到哪些臟數據的情況,該如何解決;

1.多線程同時操作變量

比如多個線程同時操作一個變量,有線程set值,有線程get值;如果不用synchronized等關鍵字會出現臟數據的情況;這主要和java的內存模型有關;

2.操作數據庫導致臟數據

比如同時往數據庫插入兩條記錄,如果沒有事務來保證數據同時成功和同時失敗,就可能會出現臟數據;

3.緩存臟數據

比如我們經常會用到緩存,保存數據庫的時候保存一份到緩存中,更新數據庫的時候也同時更新緩存,這樣取數據的時候直接從緩存獲取數據即可;如果不能保證數據同步緩存和數據庫也會出現臟數據;

4.分布式事務

比如最常見的跨行轉賬問題,如果沒有分布式事務,就可能出現臟數據;

5.數據同步

數據同步可以說是數據一致性問題最好的例子了,比如mysql主從同步,zk數據同步;這其實要牽扯出一個基礎理論CAP理論,主要內容如下:

一個分布式系統不可能同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partitiontolerance),為什么這么說其實可以給出證明的:

這里可以做一個簡單的證明:

前提:對于一個分布式系統而言,分區容錯性可以說是一個最基本的要求。因為既然是一個分布式系統,那么分布式系統中的組件必然需要被部署到不同的節點,否則也就無所謂分布式系統了;

假設網絡中有2個節點N1和N2,N1和N2上分別安裝了數據庫D1(主)和D2(備)形成主備模式,D1(主)負責寫并且讀,D2(備)分擔一部分讀

正常情況下:D1(主)寫完數據,同步到D2(備),讀取D2可以讀到最新的數據

非正常情況下:作為一個分布式系統,它和單機系統的最大區別,就在于網絡,現在假設一種極端情況,N1和N2之間的網絡斷開了;D1(主)寫完數據,D2(備)沒有更新到最新的數據;這時候怎么辦,有2個選擇:第一,犧牲數據一致性,響應舊的數據給用戶;第二,犧牲可用性,阻塞等待,直到網絡連接恢復,數據更新操作完成之后,再給用戶響應最新的數據。

所以可以看到主流的一些中間件在數據一致性問題上其實都是在AP和CP直接抉擇的,比如zk更傾向于CP,eruaka更傾向于AP;

更多可以關注本人的相關文章:

從ACID到CAP/BASE

https://www.toutiao.com/i6748644401506943499/

2PC/3PC到底是啥

https://www.toutiao.com/i6748710371780985348/

Paxos算法淺析

https://www.toutiao.com/i6748725707750244877/