您好,登錄后才能下訂單哦!
這篇“如何使用Java @Transactional指定回滾條件”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“如何使用Java @Transactional指定回滾條件”文章吧。
可查的異常(checked exceptions):Exception下除了RuntimeException外的異常
不可查的異常(unchecked exceptions):RuntimeException及其子類和錯誤(Error)
屬性 | 類型 | 描述 |
---|---|---|
value | String | 可選的限定描述符,指定使用的事務(wù)管理器 |
propagation | enum: Propagation | 可選的事務(wù)傳播行為設(shè)置 |
isolation | enum: Isolation | 可選的事務(wù)隔離級別設(shè)置 |
readOnly | boolean | 讀寫或只讀事務(wù),默認(rèn)讀寫 |
timeout | int (in seconds granularity) | 事務(wù)超時時間設(shè)置 |
rollbackFor | Class對象數(shù)組,必須繼承自Throwable | 導(dǎo)致事務(wù)回滾的異常類數(shù)組 |
rollbackForClassName | 類名數(shù)組,必須繼承自Throwable | 導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù)組 |
noRollbackFor | Class對象數(shù)組,必須繼承自Throwable | 不會導(dǎo)致事務(wù)回滾的異常類數(shù)組 |
noRollbackForClassName | 類名數(shù)組,必須繼承自Throwable | 不會導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù) |
使用@Transaction注解時,阿里巴巴代碼規(guī)范插件會提醒需要指定rollbackFor以顯示的rollback
默認(rèn)情況下,Spring框架在使用@Transaction處理事務(wù)時默認(rèn)只在拋出運(yùn)行時異常和unchecked exceptions時才會事務(wù)回滾。也就是說,當(dāng)拋出個RuntimeException 或其子類例的實(shí)例時,從事務(wù)方法中拋出的Checked exceptions將不被標(biāo)識進(jìn)行事務(wù)回滾。
讓checked異常回滾:在整個方法前加上 @Transactional(rollbackOn=Exception.class)
讓unchecked異常不回滾: @Transactional(dontRollbackOn=RunTimeException.class)
不需要事務(wù)管理的(只查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:
如果異常被try-catch了,事務(wù)就不會回滾,如果想讓事務(wù)回滾必須再往外拋try{}catch{throw Exception}
。
Spring團(tuán)隊的建議在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實(shí)現(xiàn)的任何接口上。也可以在接口上使用 @Transactional 注解,但是這種情況需要設(shè)置基于接口的代理時才生效
@Transactional 注解標(biāo)識的方法,建議處理過程盡量的簡單。尤其是帶鎖的事務(wù)方法,能不放在事務(wù)里面的最好不要放在事務(wù)里面??梢詫⒊R?guī)的數(shù)據(jù)庫查詢操作放在事務(wù)前面進(jìn)行,而將增、刪、改等操作放在事務(wù)中
@Slf4j @Service public class MemberService { @Autowired private MemberMapper memberMapper; @Transactional public Integer insert(MemberEntity memberEntity) { Integer insertResult = 0; try { insertResult = memberMapper.save(memberEntity); log.info("insertResult:{}", insertResult); int result = 1 / memberEntity.getAge(); } catch (Exception e) { log.error("errorMsg:{}", e.getMessage()); //回滾 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return insertResult; } }
如上標(biāo)紅代碼,如果不寫的話,事務(wù)是不會回滾的。因?yàn)槭聞?wù)被 catch 捕獲到了,所以只能手動的進(jìn)行事務(wù)回滾。
以上就是關(guān)于“如何使用Java @Transactional指定回滾條件”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。