在MySQL同一事務(wù)中先更新再查詢(xún),結(jié)果是更新后的數(shù)據(jù)問(wèn)題

問(wèn)題

java 代碼在同一個(gè)事務(wù)中先執(zhí)行update 再執(zhí)行select 發(fā)現(xiàn)select 的數(shù)據(jù)是update之后的結(jié)果,此時(shí)事務(wù)還沒(méi)有提交,直接查詢(xún)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)的數(shù)據(jù)還沒(méi)有發(fā)生變更。

原因

在數(shù)據(jù)庫(kù)事務(wù)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行,這是一種機(jī)制,用以維護(hù)數(shù)據(jù)庫(kù)的完整性。在你這個(gè)事務(wù)單元中存在兩個(gè)操作,一個(gè)是update,一個(gè)是select;你前面的update執(zhí)行成功了,再執(zhí)行select肯定能夠查詢(xún)到前面update的數(shù)據(jù),因?yàn)槟闶窃谝粋€(gè)單元中。但是另外一個(gè)事務(wù)(即另一個(gè)單元)則不能select到這個(gè)update的數(shù)據(jù),因?yàn)槟鉼pdate的數(shù)據(jù)還沒(méi)提交,只在該單元中有效;

注意

此處要與臟讀區(qū)分開(kāi),臟讀所指的讀到了未提交的數(shù)據(jù)(這是兩個(gè)事務(wù)操作,而本文的問(wèn)題前提是在同一個(gè)事務(wù)中)。也就是說(shuō),一個(gè)事務(wù)正在對(duì)一條記錄做修改,在這個(gè)事務(wù)完成并提交之前,這條數(shù)據(jù)是處于待定狀態(tài)的(可能提交也可能回滾),這時(shí),第二個(gè)事務(wù)來(lái)讀取這條沒(méi)有提交的數(shù)據(jù),并據(jù)此做進(jìn)一步的處理,就會(huì)產(chǎn)生未提交的數(shù)據(jù)依賴(lài)關(guān)系。這種現(xiàn)象被稱(chēng)為臟讀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容