MySQL同一事務中先更新在查詢,結果與數據庫中不一致問題


問題背景:

java 代碼在同一個事務中先執行update 再執行select 發現select 的數據是update之后的結果,此時事務還沒有提交, 但直接查詢數據庫,數據庫的數據還沒有發生變更.

問題結論:

在數據庫事務是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行,要么完全地不執行,這是一種機制,用以維護數據庫的完整性。在你這個事務單元中存在兩個操作,一個是update,一個是select;你前面的update執行成功了,再執行select肯定能夠查詢到前面update的數據,因為你是在一個單元中。但是另外一個事務(即另一個單元)則不能select到這個update的數據,因為你update的數據還沒提交,只在該單元中有效;

注意:此處要與臟讀區分開,臟讀所指的讀到了未提交的數據(這是兩個事務操作,而本文的問題前提是在同一個事務中)。也就是說,一個事務正在對一條記錄做修改,在這個事務完成並提交之前,這條數據是處於待定狀態的(可能提交也可能回滾),這時,第二個事務來讀取這條沒有提交的數據,並據此做進一步的處理,就會產生未提交的數據依賴關系。這種現象被稱為臟讀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM