Java高并發(fā)防止數(shù)據(jù)重復(fù) 在多線程處理表數(shù)據(jù)的時候怎么防止數(shù)據(jù)被重復(fù)處理?
在多線程處理表數(shù)據(jù)的時候怎么防止數(shù)據(jù)被重復(fù)處理?你好,我是[用戶4229663898417]。我很高興為你回答。這可以通過數(shù)據(jù)修改的時間來判斷。例如,表中有一個字段read time。當(dāng)客戶端讀取10
在多線程處理表數(shù)據(jù)的時候怎么防止數(shù)據(jù)被重復(fù)處理?
你好,我是[用戶4229663898417]。我很高興為你回答。這可以通過數(shù)據(jù)修改的時間來判斷。例如,表中有一個字段read time。當(dāng)客戶端讀取10條數(shù)據(jù)時,將讀取時間更新為當(dāng)前時間。然后下一個客戶看的時候,判斷時間在半小時之內(nèi),沒有更新的數(shù)據(jù)。沒關(guān)系。然而,這其中有一個壞處。很可能第一個客戶在半小時內(nèi)仍會使用這十條數(shù)據(jù)。如果是修改數(shù)據(jù),所有者可以使用鎖定功能鎖定數(shù)據(jù)庫表,這樣就不用擔(dān)心重復(fù)提交。希望您能盡快解決問題~~~有更多專業(yè)的科學(xué)知識,歡迎關(guān)注我。如果你喜歡我的回答,也請給我表揚(yáng)或轉(zhuǎn)發(fā),你的鼓勵是支持我寫下來的動力,謝謝。
如何保證多線程從mysql數(shù)據(jù)庫查詢的數(shù)據(jù)不重復(fù)?
對于MySQL,可能會發(fā)生臟讀、不可重復(fù)讀和不真實(shí)讀。MySQL的默認(rèn)設(shè)置是repeatable read,即在一個事務(wù)中不會讀取不同的數(shù)據(jù)。您可以執(zhí)行以下操作:
1)打開兩個客戶端,兩個客戶端都設(shè)置為RR;
2)在一個事務(wù)中,查詢一個操作以查找一段數(shù)據(jù);例如,字段version=1中有數(shù)據(jù);
3)在另一個事務(wù)中,刪除version=1的數(shù)據(jù);刪除后,查詢該事務(wù)中的數(shù)據(jù)是否為2所屬沒有更改,或者有版本為1的數(shù)據(jù);
4)當(dāng)我們繼續(xù)更新2所屬事務(wù)中的數(shù)據(jù)時,我們會發(fā)現(xiàn)它無法更新,并且會看到版本為1的數(shù)據(jù)。緩存一致性:緩存一致性,用什么一致性?它與數(shù)據(jù)庫一致,外部查詢每次都是一致的。那么,應(yīng)該首先在緩存和數(shù)據(jù)庫之間更新哪一個呢?有些人可能認(rèn)為我可以先更新數(shù)據(jù)庫,然后再更新緩存?但是你想過一個問題嗎?當(dāng)用戶成功支付時,更新數(shù)據(jù)庫,但是什么?如果你仍然顯示你沒有在緩存中付費(fèi),當(dāng)用戶頻繁點(diǎn)擊,數(shù)據(jù)庫壓力太大而無法同步到緩存時,你會感到尷尬嗎?這是一個典型的不一致。當(dāng)用戶再次付費(fèi)時,你告訴他已經(jīng)付費(fèi)了,他會罵死你。你怎么能這么做?我們可以先更新緩存,然后再更新數(shù)據(jù)庫,那有什么問題?1) 緩存更新成功,但數(shù)據(jù)庫更新失敗,并被其他并發(fā)線程訪問。2) 緩存消除成功,但數(shù)據(jù)庫更新失敗,也會導(dǎo)致后期數(shù)據(jù)不一致
簡要說明以下原因:
鎖定是因?yàn)椴僮鞑皇窃拥?。讓我們把我的手術(shù)作為一個解釋。參見下面兩個圖。
我這個操作需要
看上面的第二個圖,你能很清楚地理解這個過程嗎?
鎖定是為了確保上述三個步驟是原子操作。
回到問題上來,只有一個線程要寫,沒有競爭,所以不需要鎖定。
但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在
在一個線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。