Spring @transactional註解在什麼情況下會失效

這幾天在項目裏面發現我使用@Transactional註解事務之後,拋了異常居然不回滾。後來終於找到了原因。
如果你也出現了這種情況,可以從下面開始排查。

一、特性

先來了解一下@Transactional註解事務的特性吧,可以更好排查問題

1、service類標籤(一般不建議在接口上)上添加@Transactional,可以將整個類納入spring事務管理,在每個業務方法執行時都會開啓一個事務,不過這些事務採用相同的管理方式。

2、@Transactional 註解只能應用到 public 可見度的方法上。 如果應用在protected、private或者 package可見度的方法上,也不會報錯,不過事務設置不會起作用。

3、默認情況下,Spring會對unchecked異常進行事務回滾;如果是checked異常則不回滾。
辣麼什麼是checked異常,什麼是unchecked異常

java裏面將派生於Error或者RuntimeException(比如空指針,1/0)的異常稱爲unchecked異常,其他繼承自java.lang.Exception得異常統稱爲Checked Exception,如IOException、TimeoutException等

辣麼再通俗一點:你寫代碼出現的空指針等異常,會被回滾,文件讀寫,網絡出問題,spring就沒法回滾了。然後我教大家怎麼記這個,因爲很多同學容易弄混,你寫代碼的時候有些IOException我們的編譯器是能夠檢測到的,說以叫checked異常,你寫代碼的時候空指針等死檢測不到的,所以叫unchecked異常。這樣是不是好記一些啦

4、只讀事務:
@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
只讀標誌只在事務啓動時應用,否則即使配置也會被忽略。
啓動事務會增加線程開銷,數據庫因共享讀取而鎖定(具體跟數據庫類型和事務隔離級別有關)。通常情況下,僅是讀取數據時,不必設置只讀事務而增加額外的系統開銷。

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