@Tranactional註解rollbackFor爲何默認是RuntimeException?

來源

這個問題是大概三年前,去面試的時候,面試官問個人問題,當時對這個問題是不清楚,平時開發工做的時候,只知道用到事務的方法上加上@Tranactionnal註解,甚至看別人的代 碼使用了rollbackFor=Exception.class,(以下圖所示)也會堅決果斷的照抄過來,至於爲何暫且不問, 至少你們都是這麼去寫的, image.png面試

本身的理解

隨着工做的年限的增長,後來仍是對於技術的好奇心驅使我不斷探索技術背後的原理,其實 @Transactional是spring的aop實現的典型,經過cglib的動態代理去實現的的編程模式, 這個是衆所周知的,我想回答的是@Transactional的rollbackFor爲何是RuntimeException的, 從下圖能夠看出TransactionAspectSupport的 invokeWithinTransaction方法中執行事務的的攔截,當發生異常的時候,執行回滾, 從最後一張圖上能夠看出,事務發生回滾的默認是判斷RuntimeException或者Error異常, 這兩個都屬於Throwable,
最後一個問題,爲何受檢異常不發生回滾呢? 答案很是簡單,就是由於受檢異常, 是編譯期間須要try catch捕獲的,而捕獲的異常,事務執行是不會回滾的,spring

image.png

image.png

image.png

總結:
今天主要講了@Transaction的回滾的機制,明白了這個以後, 之後看到第一張相似 寫@Transaction(rollbackFor=Exception.class)是寫代碼對底層的不理解致使的。編程

相關文章
相關標籤/搜索