Spring配置事務(wù)中@Transactional各個(gè)屬性定義

Spring中的@Transactional注解比較重要的一些屬性,比如 Propagation(事務(wù)傳播屬性),Isolation(事務(wù)隔離級(jí)別),Rollback Rules(事務(wù)回滾規(guī)則,默認(rèn)情況是RunTimeException時(shí)的回滾,即unchecked exception) ,Timeout(事務(wù)執(zhí)行時(shí)長,默認(rèn)30秒),Read-Only(是否只讀,聲明只讀可加快事務(wù)執(zhí)行速度)。除了這些屬 性,還有其他一些屬性,具體如下表格描述:

readOnly
該屬性用于設(shè)置當(dāng)前事務(wù)是否為只讀事務(wù),設(shè)置為true表示只讀,false則表示可讀寫,默認(rèn)值為false。例如:@Transactional(readOnly=true)

rollbackFor
該屬性用于設(shè)置需要進(jìn)行回滾的異常類數(shù)組,當(dāng)方法中拋出指定異常數(shù)組中的異常時(shí),則進(jìn)行事務(wù)回滾。例如:
指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)
指定多個(gè)異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

rollbackForClassName
該屬性用于設(shè)置需要進(jìn)行回滾的異常類名稱數(shù)組,當(dāng)方法中拋出指定異常名稱數(shù)組中的異常時(shí),則進(jìn)行事務(wù)回滾。例如:
指定單一異常類名稱:@Transactional(rollbackForClassName="RuntimeException")
指定多個(gè)異常類名稱:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor
該屬性用于設(shè)置不需要進(jìn)行回滾的異常類數(shù)組,當(dāng)方法中拋出指定異常數(shù)組中的異常時(shí),不進(jìn)行事務(wù)回滾。例如:
指定單一異常類:@Transactional(noRollbackFor=RuntimeException.class)
指定多個(gè)異常類:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName
該屬性用于設(shè)置不需要進(jìn)行回滾的異常類名稱數(shù)組,當(dāng)方法中拋出指定異常名稱數(shù)組中的異常時(shí),不進(jìn)行事務(wù)回滾。例如:
指定單一異常類名稱:@Transactional(noRollbackForClassName="RuntimeException")
指定多個(gè)異常類名稱:@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation
該屬性用于設(shè)置事務(wù)的傳播行為。
例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation
該屬性用于設(shè)置底層數(shù)據(jù)庫的事務(wù)隔離級(jí)別,事務(wù)隔離級(jí)別用于處理多事務(wù)并發(fā)的情況,通常使用數(shù)據(jù)庫的默認(rèn)隔離級(jí)別即可,基本不需要進(jìn)行設(shè)置

timeout
該屬性用于設(shè)置事務(wù)的超時(shí)秒數(shù),默認(rèn)值為-1表示永不超時(shí)

如果我們在一個(gè)業(yè)務(wù)類的前邊加上@Transactional,那么這個(gè)類的所有方法需要事務(wù)管理,當(dāng)執(zhí)行每一個(gè)業(yè)務(wù)方法開始時(shí)都會(huì)打開一個(gè)事務(wù)。

①propagation 屬性

  事物傳播行為介紹:

@Transactional(propagation=Propagation.REQUIRED) :如果有事務(wù), 那么加入事務(wù), 沒有的話新建一個(gè)(默認(rèn)情況下)
  @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不為這個(gè)方法開啟事務(wù)
  @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事務(wù),都創(chuàng)建一個(gè)新的事務(wù),原來的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務(wù)
  @Transactional(propagation=Propagation.MANDATORY) :必須在一個(gè)已有的事務(wù)中執(zhí)行,否則拋出異常
  @Transactional(propagation=Propagation.NEVER) :必須在一個(gè)沒有的事務(wù)中執(zhí)行,否則拋出異常(與Propagation.MANDATORY相反)
  @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean調(diào)用這個(gè)方法,在其他bean中聲明事務(wù),那就用事務(wù).如果其他bean沒有聲明事務(wù),那就不用事務(wù).

②timeout屬性

@Transactional(timeout=30) //默認(rèn)是30秒

③Isolation屬性

  @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀, 不可重復(fù)讀) 基本不使用;

就是俗稱“臟讀”(dirty read),在沒有提交數(shù)據(jù)時(shí)能夠讀到已經(jīng)更新的數(shù)據(jù)

  @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀);在一個(gè)事務(wù)中進(jìn)行查詢時(shí),允許讀取提交前的數(shù)據(jù),數(shù)據(jù)提交后,當(dāng)前查詢就可以讀取到數(shù)據(jù)。update數(shù)據(jù)時(shí)候并不鎖住表
  @Transactional(isolation = Isolation.REPEATABLE_READ):可重復(fù)讀(會(huì)出現(xiàn)幻讀);在一個(gè)事務(wù)中進(jìn)行查詢時(shí),不允許讀取其他事務(wù)update的數(shù)據(jù),允許讀取到其他事務(wù)提交的新增數(shù)據(jù)
  @Transactional(isolation = Isolation.SERIALIZABLE):串行化;在一個(gè)事務(wù)中進(jìn)行查詢時(shí),不允許任何對這個(gè)查詢表的數(shù)據(jù)修改。

MYSQL: 默認(rèn)為REPEATABLE_READ級(jí)別
  SQLSERVER和Oracle: 默認(rèn)為READ_COMMITTED

臟讀 : 一個(gè)事務(wù)讀取到另一事務(wù)未提交的更新數(shù)據(jù)
  不可重復(fù)讀 : 在同一事務(wù)中, 多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同, 換句話說, 后續(xù)讀取可以讀到另一事務(wù)已提交的更新數(shù)據(jù). 相反, "可重復(fù)讀"在同一事務(wù)中多次
讀取數(shù)據(jù)時(shí), 能夠保證所讀數(shù)據(jù)一樣, 也就是后續(xù)讀取不能讀到另一事務(wù)已提交的更新數(shù)據(jù)
  幻讀 : 一個(gè)事務(wù)讀到另一個(gè)事務(wù)已提交的insert數(shù)據(jù)

需要注意的地方:

  @Transactional 只能被應(yīng)用到public方法上, 對于其它非public的方法,如果標(biāo)記了@Transactional也不會(huì)報(bào)錯(cuò),但方法沒有事務(wù)功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容