一,特性:
1隧出,一般在service里加@Transactional注解踏志,不建議在接口上添加,加了此注解后此類會納入spring事務(wù)管理中胀瞪,每個業(yè)務(wù)方法執(zhí)行時针余,都會開啟一個事務(wù),不過都是按照相同的管理機制凄诞。
2涵紊,@Transactional注解只能應(yīng)用到public修飾符上,其它修飾符不起作用幔摸,但不報錯摸柄。
3,默認情況下此注解會對unchecked異常進行回滾既忆,對checked異常不回滾驱负。
那什么是unchecked,什么是checked呢嗦玖?
通俗的說,編譯器能檢測到的是checked跃脊,檢測不到的就是unchecked宇挫。
派生于Error或者RuntimeException(比如空指針,1/0)的異常稱為unchecked異常酪术。
繼承自Exception得異常統(tǒng)稱為checked異常器瘪,如IOException、TimeoutException等绘雁。
4橡疼、只讀事務(wù):
@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
只讀標志只在事務(wù)啟動時應(yīng)用,否則即使配置也會被忽略庐舟。
啟動事務(wù)會增加線程開銷欣除,數(shù)據(jù)庫因共享讀取而鎖定(具體跟數(shù)據(jù)庫類型和事務(wù)隔離級別有關(guān))。通常情況下挪略,僅是讀取數(shù)據(jù)時历帚,不必設(shè)置只讀事務(wù)而增加額外的系統(tǒng)開銷。
二:事務(wù)傳播模式
Propagation枚舉了多種事務(wù)傳播模式杠娱,部分列舉如下:
1挽牢、REQUIRED(默認模式):業(yè)務(wù)方法需要在一個容器里運行。如果方法運行時摊求,已經(jīng)處在一個事務(wù)中禽拔,那么加入到這個事務(wù),否則自己新建一個新的事務(wù)睹簇。
2奏赘、NOT_SUPPORTED:聲明方法不需要事務(wù)。如果方法沒有關(guān)聯(lián)到一個事務(wù)太惠,容器不會為他開啟事務(wù)磨淌,如果方法在一個事務(wù)中被調(diào)用,該事務(wù)會被掛起凿渊,調(diào)用結(jié)束后梁只,原先的事務(wù)會恢復(fù)執(zhí)行。
3埃脏、REQUIRESNEW:不管是否存在事務(wù)搪锣,該方法總匯為自己發(fā)起一個新的事務(wù)。如果方法已經(jīng)運行在一個事務(wù)中彩掐,則原有事務(wù)掛起构舟,新的事務(wù)被創(chuàng)建。
4堵幽、 MANDATORY:該方法只能在一個已經(jīng)存在的事務(wù)中執(zhí)行狗超,業(yè)務(wù)方法不能發(fā)起自己的事務(wù)弹澎。如果在沒有事務(wù)的環(huán)境下被調(diào)用,容器拋出例外努咐。
5苦蒿、SUPPORTS:該方法在某個事務(wù)范圍內(nèi)被調(diào)用,則方法成為該事務(wù)的一部分渗稍。如果方法在該事務(wù)范圍外被調(diào)用佩迟,該方法就在沒有事務(wù)的環(huán)境下執(zhí)行。
6竿屹、NEVER:該方法絕對不能在事務(wù)范圍內(nèi)執(zhí)行报强。如果在就拋例外。只有該方法沒有關(guān)聯(lián)到任何事務(wù)羔沙,才正常執(zhí)行躺涝。
7厨钻、NESTED:如果一個活動的事務(wù)存在扼雏,則運行在一個嵌套的事務(wù)中。如果沒有活動事務(wù)夯膀,則按REQUIRED屬性執(zhí)行诗充。它使用了一個單獨的事務(wù),這個事務(wù)擁有多個可以回滾的保存點诱建。內(nèi)部事務(wù)的回滾不會對外部事務(wù)造成影響蝴蜓。它只對DataSourceTransactionManager事務(wù)管理器起效。
三俺猿,解決注解不回滾問題
1茎匠,檢查方法是不是public
2,檢查異常是不是unchecked異常
3押袍,如果是checked異常也想回滾的話诵冒,注解上寫明異常類型即可
@Transactional(rollbackFor=Exception.class)