Spring的事務(wù)傳播行為
PROPAGATION_REQUIRED ,如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù)則開啟一個(gè)新的事務(wù)
PROPAGATION_SUPPORTS 思币,如果存在一個(gè)事務(wù),支持當(dāng)前事務(wù)羡微。如果沒有事務(wù)谷饿,則非事務(wù)的執(zhí)行。
PROPAGATION_MANDATORY 妈倔,如果已經(jīng)存在一個(gè)事務(wù)博投,支持當(dāng)前事務(wù)。如果沒有一個(gè)活動(dòng)的事務(wù)启涯,則拋出異常贬堵。
PROPAGATION_REQUIRES_NEW, 總是開啟一個(gè)新的事務(wù)结洼。如果一個(gè)事務(wù)已經(jīng)存在黎做,則將這個(gè)存在的事務(wù)掛起。
PROPAGATION_NOT_SUPPORTED松忍, 總是非事務(wù)地執(zhí)行蒸殿,并掛起任何存在的事務(wù)。
PROPAGATION_NEVER ,總是非事務(wù)地執(zhí)行宏所,如果存在一個(gè)活動(dòng)事務(wù)酥艳,則拋出異常
PROPAGATION_NESTED,如果一個(gè)活動(dòng)的事務(wù)存在爬骤,則運(yùn)行在一個(gè)嵌套的事務(wù)中. 如果沒有活動(dòng)事務(wù), 則按PROPAGATION_REQUIRED 屬性執(zhí)行
嵌套事務(wù)和新的事務(wù)的區(qū)別
新的事務(wù)充石,獨(dú)立于之前的服務(wù),互不影響提交回滾霞玄。
嵌套事務(wù)骤铃,是以之前的服務(wù)為父事務(wù),起的一個(gè)子事務(wù)坷剧。子事務(wù)執(zhí)行完之后惰爬,父事務(wù)才會(huì)接著實(shí)行。子事務(wù)的回滾不會(huì)導(dǎo)致父事務(wù)的回滾惫企。但是父事務(wù)的回滾帶導(dǎo)致子事務(wù)的回滾撕瞧。父事務(wù)提交,子事務(wù)也回跟著提交狞尔。
Spring的事務(wù)配置
聲明式的事務(wù)處理中丛版,要配置一個(gè)切面,即一組方法沪么,如
<!-- 隔離級別配置-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="query*" propagation="SUPPORTS" read-only="true" />
<tx:method name="list*" propagation="SUPPORTS" read-only="true" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
1硼婿、事務(wù)的傳播性:@Transactional(propagation=Propagation.REQUIRED)
如果有事務(wù), 那么加入事務(wù), 沒有的話新建一個(gè)(默認(rèn)情況下)
2、事務(wù)的超時(shí)性:@Transactional(timeout=30) //默認(rèn)是30秒
注意這里說的是事務(wù)的超時(shí)性而不是Connection的超時(shí)性禽车,這兩個(gè)是有區(qū)別的
3寇漫、事務(wù)的隔離級別:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀, 不可重復(fù)讀) 基本不使用
4、回滾:
指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)
指定多個(gè)異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
該屬性用于設(shè)置需要進(jìn)行回滾的異常類數(shù)組殉摔,當(dāng)方法中拋出指定異常數(shù)組中的異常時(shí)州胳,則進(jìn)行事務(wù)回滾。
5逸月、只讀:@Transactional(readOnly=true)
該屬性用于設(shè)置當(dāng)前事務(wù)是否為只讀事務(wù)栓撞,設(shè)置為true表示只讀,false則表示可讀寫碗硬,默認(rèn)值為false瓤湘。
只讀事務(wù):如果你一次執(zhí)行多條查詢語句,多條查詢SQL必須保證整體的讀一致性恩尾,否則弛说,在前條SQL查詢之后,后條SQL查詢之前翰意,數(shù)據(jù)被其他用戶改變瘸彤,則該次整體的查詢將會(huì)出現(xiàn)讀數(shù)據(jù)不一致的狀態(tài),此時(shí)件甥,應(yīng)該啟用事務(wù)支持