通過Spring層面進(jìn)行事務(wù)回滾的實(shí)現(xiàn)
Spring 中事務(wù)可以分為聲明式事務(wù)和編程式事務(wù),那么解下來就從這兩方面說一說在 Spring 層面?zhèn)€怎么進(jìn)行回滾
聲明式事務(wù)回滾:
1. 基礎(chǔ)注解配置
通過@Transactional注解實(shí)現(xiàn)自動回滾,默認(rèn)對RuntimeException和Error生效
@Transactional
public void transferMoney(Account from, Account to, double amount) {
from.withdraw(amount); // 扣款
to.deposit(amount); // 存款
// 若在此處拋出RuntimeException,事務(wù)自動回滾
}
2. 指定回滾異常類型
可以通過 @Transactional 注解的 rollbackFor 參數(shù)擴(kuò)展回滾范圍到受檢異常
@Transactional(rollbackFor = {SQLException.class, BusinessException.class})
public void processOrder(Order order) throws CustomException {
// 拋出SQLException或BusinessException時(shí)回滾
}
需要顯示聲明受檢查異常類型,否則不會滾
3. ?不回滾特殊場景
使用 noRollbackFor 參數(shù)排除特定異常
@Transactional(noRollbackFor = {ValidationException.class})
public void validateData(Data data) {
// ValidationException不會觸發(fā)回滾
}
編程式事務(wù)回滾:
1. ?使用 TransactionTemplate 實(shí)現(xiàn)編程式事務(wù)
@Autowired
private TransactionTemplate transactionTemplate;
public void batchProcess() {
transactionTemplate.execute(status -> {
try {
// 業(yè)務(wù)操作...
if (errorCondition) status.setRollbackOnly();
return result;
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
});
}
2. 使用 ?PlatformTransactionManager 實(shí)現(xiàn)編程式事務(wù)
直接操作事務(wù)管理器實(shí)現(xiàn)完全控制
@Autowired
private PlatformTransactionManager transactionManager;
public void complexOperation() {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// 業(yè)務(wù)操作...
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw new ServiceException("操作失敗", e);
}
}
嵌套事務(wù)與傳播行為相關(guān)的異常回滾:
1. 嵌套事務(wù)(PROPAGATION_NESTED)
子事務(wù)作為父事務(wù)的保存點(diǎn),可部分回滾
@Transactional(propagation = Propagation.REQUIRED)
public void parentMethod() {
// 主業(yè)務(wù)邏輯
childMethod(); // 嵌套子事務(wù)
}
@Transactional(propagation = Propagation.NESTED)
public void childMethod() {
// 子事務(wù)操作,失敗僅回滾子操作
}
2.傳播行為控制
通過傳播策略控制事務(wù)邊界:
REQUIRES_NEW:始終新建事務(wù)
MANDATORY:必須存在父事務(wù)
NOT_SUPPORTED:非事務(wù)執(zhí)行
通過 xml 的方式配置全局回滾規(guī)則:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="save*" rollback-for="java.lang.Exception"/>
<tx:method name="update*" no-rollback-for="BusinessWarning"/>
</tx:attributes>
</tx:advice>到此這篇關(guān)于通過Spring層面進(jìn)行事務(wù)回滾的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring事務(wù)回滾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+logback默認(rèn)日志的配置和使用方式
這篇文章主要介紹了SpringBoot+logback默認(rèn)日志的配置和使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConver
這篇文章主要介紹了springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConversions問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
java使用socket實(shí)現(xiàn)一個(gè)多線程web服務(wù)器的方法
今天小編就為大家分享一篇java使用socket實(shí)現(xiàn)一個(gè)多線程web服務(wù)器的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Java AbstractMethodError原因案例詳解
這篇文章主要介紹了Java AbstractMethodError原因案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

