休年假在家無聊椅野,又重新把spring相關的知識看了看力奋,源碼太多榜旦,只能看個大致,路還是要一步一步走啊景殷,這一年多時間著實是落下了很多知識點溅呢,現在感覺又要重新炒飯,還好古人有云要學而時習之猿挚,所以每次回顧都應該有更高層次的抽象和理解才對咐旧。
spring常見的問題,其中Bean的加載绩蜻、Bean的生命周期以及容器相關的知識是面試官們最津津樂道的問題吧铣墨,也是我一直看了好多遍卻死活不想記住的幾個點。本質還是因為自己的觀點上認為這些東西大概是不需要花很多心思去care的办绝,然而這也正是一直以來的誤區(qū)所在伊约。有時候,深究其原理才能更深刻的領悟其中的設計之美呢孕蝉。
Spring的框架結構圖
Spring的事務
- 編程式事務
TransactionTemplate - 聲明式事務
通過傳播行為屡律、隔離級別、只讀提示降淮、事務超時以及回滾規(guī)則來進行定義超埋。
傳播行為定義了客戶端與被調用方法之間的事務邊界。Spring定義了7種不同的傳播行為,
propagation_Mandatory 強制在事務中進行霍殴,如果沒有事務就拋出異常
propagation_required 必須在事務中進行窍蓝,如果沒有事務就啟動一個新的事務
propagation_nested 嵌套事務,如果當前已經存在一個事務繁成,那么該事務將會在嵌套事務中執(zhí)行,嵌套的事務可以獨立于對當前事務進行單獨提交或回滾淑玫,如果當前事務不存在巾腕,同required。
propagation_supported 不需要事務上下文絮蒿,但是如果存在當前事務的話尊搬,那么該方法會在這個事務中運行。
propagation_not_supported 當前方法不應該運行在事務中土涝,如果存在當前事務佛寿,當前事務會被掛起。
propagation_never 強制不能在事務中進行但壮,如果沒有事務就拋出異常
propagation_required_new 當前方法必須運行在自己的事務里冀泻,如果存在當前事務,在該方法執(zhí)行期間蜡饵,當前視為會被掛起弹渔。
隔離級別定義了一個事務可能受其他并發(fā)事務影響的程度。
isolation_default 使用后端數據庫默認的隔離級別
isolation_read_uncommited 允許讀取尚未提交的數據變更 (臟讀溯祸、幻讀肢专、不可重復讀)
isolation_read_commited 允許并發(fā)事務讀取已經提交的數據,可以阻止臟讀焦辅,但幻讀或不可重復讀仍可能發(fā)生博杖。
isolation_repeatable_read 對同一字段的多次讀取結果是一致的,除非數據是被本事務自己所修改筷登。
isolation_serializable 最慢剃根,通過鎖數據庫表來實現。
tips:
臟讀的原因:事務1更新的數據未提交到數據仆抵,事務2也讀取該數據
不可重復讀的重點是修改 :
同樣的條件 , 讀取過的數據 , 再次讀取出來發(fā)現值不一樣了 跟继。
幻讀的重點是**新增或者刪除 **
同樣的條件 , 第 1 次和第 2 次讀出來的記錄數不一樣。
MySQL默認的隔離級別是 :可重復讀镣丑。
只讀 是否是只讀事務舔糖,如果事務只對后端數據庫進行讀操作,數據庫可以利用事務的只讀特性來進行一個特定的優(yōu)化莺匠。
事務超時 可以聲明一個事務在等待特定的秒數后自動回滾金吗,而不是等待其結束。
回滾規(guī)則 定義了哪些異常會導致事務回滾而哪些不會。