記JPA 儲存資料異常: Row was updated or deleted by another transaction

飛越南牆的曉M發表於2020-09-27

用Hibernate的小夥伴可能也知道,偶爾會出現上述標題中的異常。但是此處陳述的情況前提是:程式碼寫正確的情況。

1.有兩個物件,如下關係圖:在B 類中引用了A類;

2.程式碼的執行流程大致如下:(所有流程都是在一個事務中,其中編碼唯一性校驗是用切面的做的,未開啟事務

3. 異常資訊:


javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.xxx.xx#10]
        at org.hibernate.internal.ExceptionConverterImpl.wrapStaleStateException(ExceptionConverterImpl.java:223)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:93)
        at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1539)
        at org.hibernate.query.Query.getResultList(Query.java:165)
        

4.通過檢視debug 除錯進入Hibernate 的原始碼,發現在儲存B的時候報錯了,大致原因就是因為:在校驗B的編碼是否唯一時,Hibernate flush了,將A的版本號設為1,而由於是同一個事務,儲存B的時候A已經發生了變化,故報已經被另一個事務更新或刪除。

5.解決方式:

在校驗編碼是否唯一時,將重新開啟一個新的事務,避開flush即可解決。
 

 

相關文章