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