Hibernate事務提交執行sql順序與代碼順序不一致問題

問題

SSH框架下,spring的事務中提交時hibernate的sql執行順序錯亂,未按代碼順序實現。 JPA也是。

Hibernate在最終執行SQL語句時,居然是按INSERT, UPDATE, DELETE的順序執行的,而非按照代碼順序執行!

代碼中的執行順序
在這裏插入圖片描述
事務提交後Hibernate Session中的執行順序
在這裏插入圖片描述

原因

Hibernate爲了性能優化,對象操作都是放在緩存裏而沒有立即執行數據庫操作直到commit操作,爲的是利用batch操作提高數據庫操作性能。看完這句話感覺Hibernate還挺好,自行優化,如果只到這裏那豈不是皆大歡喜。但是、但是、但是,Hibernate有個騷操作:在最終執行SQL語句時,會重新給SQL排序,按INSERT, UPDATE, DELETE的順序執行的,而非按照代碼順序執行!W T F!L Z的業務邏輯怎麼辦?同理,在一個事務中混用Hibernate和Jdbc操作,也會導致數據不一致的問題。

具體的執行順序:
所有對實體進行插入的語句,其順序按照對象執行Session.save()的時間順序
所有對實體進行更新的語句
所有進行集合刪除的語句
所有對集合元素進行刪除,更新或者插入的語句
所有進行集合插入的語句
所有對實體進行刪除的語句,其順序按照對象執行Session.delete()的時間順序

解決辦法

在需要同步的地方(即按照INSERT, UPDATE, DELETE順序有可能產生問題的時候;混用JDBC操作的時候),執行session.flush()方案,該方法將緩存中的數據請求立即轉換爲數據庫操作並執行

flush就是把sql緩衝區的sql語句發送到數據庫去。

在大批量數據處理的時候,可能需要分批刷出數據,然後清空緩存,以減少內存佔用量。

如果操作邏輯少的話,執行完每條sql都會返回一個int值(成功行數),>0則執行下一條sql,這樣做,hibernate也會去判斷,然後執行與代碼一樣邏輯的順序。

參考博客:hibernate/jpa事務提交執行sql順序(坑)

END 2020年4月19日21:55:52

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章