什么是臟數據,臟數據就是過期的數據;
為什么會出現臟數據,根本原因還是數據沒有同步,歸根結底其實就是數據一致性問題,怎么保證數據的一致性這本身就是一個難題;我們平時會遇到哪些臟數據的情況,該如何解決;
比如多個線程同時操作一個變量,有線程set值,有線程get值;如果不用synchronized等關鍵字會出現臟數據的情況;這主要和java的內存模型有關;
比如同時往數據庫插入兩條記錄,如果沒有事務來保證數據同時成功和同時失敗,就可能會出現臟數據;
比如我們經常會用到緩存,保存數據庫的時候保存一份到緩存中,更新數據庫的時候也同時更新緩存,這樣取數據的時候直接從緩存獲取數據即可;如果不能保證數據同步緩存和數據庫也會出現臟數據;
比如最常見的跨行轉賬問題,如果沒有分布式事務,就可能出現臟數據;
數據同步可以說是數據一致性問題最好的例子了,比如mysql主從同步,zk數據同步;這其實要牽扯出一個基礎理論CAP理論,主要內容如下:
一個分布式系統不可能同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partitiontolerance),為什么這么說其實可以給出證明的:
這里可以做一個簡單的證明:
假設網絡中有2個節點N1和N2,N1和N2上分別安裝了數據庫D1(主)和D2(備)形成主備模式,D1(主)負責寫并且讀,D2(備)分擔一部分讀
所以可以看到主流的一些中間件在數據一致性問題上其實都是在AP和CP直接抉擇的,比如zk更傾向于CP,eruaka更傾向于AP;
更多可以關注本人的相關文章:
https://www.toutiao.com/i6748644401506943499/
https://www.toutiao.com/i6748710371780985348/
https://www.toutiao.com/i6748725707750244877/