在我的服務類(被註釋爲交易),我更新,然後保存對象爲:休眠拿到後刷新數據提交之前
myObj.save(flush:true) //(Thread A, updates the value, Step A)
在此之後,數據的處理髮生這需要很長時間。在這個處理過程中,在域類中進行了很多更改,但這些更改在這裏不相關。由於所有這些處理都發生在同一個服務類中,因此它是單個事務的一部分。
現在,在此期間,當所有這些處理是怎麼回事,另一個線程,這是一個不同的休眠會話的一部分,訪問
MyObj.findAll() //Thread B
,並在結果集我看到更新後的值。在Step A
中更新的值但是,線程A尚未完成,因此更改尚未提交到數據庫。我可以證實這一點,因爲如果我直接在mysql workbench中運行查詢,那麼我沒有看到更改。僅當通過休眠訪問對象時纔會顯示更改。
我的印象是,如果由於刷新而進行更改,那麼這些更改在同一個事務中可見,而在其他事務中不可見。有人可以澄清?
感謝您的解釋,它確實有幫助。但是,當我使用查詢「select @@ GLOBAL.tx_isolation,@@ tx_isolation;」檢查MySQL中的隔離級別時它顯示'REPEATABLE-READ'。 我會調查hibernate是否設置了一些隔離級別,雖然它不應該是這樣,但我仍然會試圖找出答案。任何其他想法/解釋爲什麼它可能發生,因爲隔離級別是可重複讀取。 – Zohaib
正如你從答案中的第一句話中可以看到的那樣,''InnoDB的默認隔離級別是REPEATABLE READ。''根據我的經驗,ORM很少設置隔離級別,他們只是使用任何設置。 – Shadow
是的,這也是我所假設的。 Hibernate絕對不會設置隔離級別。這就是爲什麼原始的根本原因仍然未知。感謝您的時間,讓我知道是否還有其他事情我應該調查以找出爲什麼線程B在threadA尚未完成時讀取更新。 – Zohaib