通過Spring層面進(jìn)行事務(wù)回滾的實(shí)現(xiàn)
Spring 中事務(wù)可以分為聲明式事務(wù)和編程式事務(wù),那么解下來就從這兩方面說一說在 Spring 層面?zhèn)€怎么進(jìn)行回滾
聲明式事務(wù)回滾:
1. 基礎(chǔ)注解配置
通過@Transactional注解實(shí)現(xiàn)自動(dòng)回滾,默認(rèn)對(duì)RuntimeException和Error生效
@Transactional
public void transferMoney(Account from, Account to, double amount) {
from.withdraw(amount); // 扣款
to.deposit(amount); // 存款
// 若在此處拋出RuntimeException,事務(wù)自動(dòng)回滾
}
2. 指定回滾異常類型
可以通過 @Transactional 注解的 rollbackFor 參數(shù)擴(kuò)展回滾范圍到受檢異常
@Transactional(rollbackFor = {SQLException.class, BusinessException.class})
public void processOrder(Order order) throws CustomException {
// 拋出SQLException或BusinessException時(shí)回滾
}
需要顯示聲明受檢查異常類型,否則不會(huì)滾
3. ?不回滾特殊場(chǎng)景
使用 noRollbackFor 參數(shù)排除特定異常
@Transactional(noRollbackFor = {ValidationException.class})
public void validateData(Data data) {
// ValidationException不會(huì)觸發(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java純代碼實(shí)現(xiàn)導(dǎo)出PDF功能
在項(xiàng)目開發(fā)中,產(chǎn)品的需求越來越奇葩啦,開始文件下載都是下載為excel的,做著做著需求竟然變了,要求能導(dǎo)出pdf,本文就來和大家分享一下Java實(shí)現(xiàn)導(dǎo)出PDF的常用方法吧2023-07-07
java web用servlet監(jiān)聽器實(shí)現(xiàn)顯示在線人數(shù)
這篇文章主要為大家詳細(xì)介紹了java web用servlet監(jiān)聽器實(shí)現(xiàn)顯示在線人數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
springboot整合shiro多驗(yàn)證登錄功能的實(shí)現(xiàn)(賬號(hào)密碼登錄和使用手機(jī)驗(yàn)證碼登錄)
這篇文章給大家介紹springboot整合shiro多驗(yàn)證登錄功能的實(shí)現(xiàn)方法,包括賬號(hào)密碼登錄和使用手機(jī)驗(yàn)證碼登錄功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-07-07
Java的四種常見線程池及Scheduled定時(shí)線程池實(shí)現(xiàn)詳解
這篇文章主要介紹了Java的四種常見線程池及Scheduled定時(shí)線程池實(shí)現(xiàn)詳解,在Java中,我們可以通過Executors類來創(chuàng)建ScheduledThreadPool,Executors類提供了幾個(gè)靜態(tài)方法來創(chuàng)建不同類型的線程池,包括ScheduledThreadPool,需要的朋友可以參考下2023-09-09
idea中配置tomcat啟動(dòng)jsp項(xiàng)目過程
在IntelliJ IDEA中配置Tomcat并啟動(dòng)JSP項(xiàng)目,首先需要在IDEA中安裝和配置Tomcat服務(wù)器,接著將項(xiàng)目與Tomcat關(guān)聯(lián),設(shè)置正確的部署路徑和端口號(hào),通過這些步驟,可以實(shí)現(xiàn)JSP項(xiàng)目的本地運(yùn)行和調(diào)試,使得開發(fā)和測(cè)試工作更加高效2024-10-10
struts1實(shí)現(xiàn)簡(jiǎn)單的登錄功能實(shí)例(附源碼)
本篇文章主要介紹了struts1實(shí)現(xiàn)簡(jiǎn)單的登錄功能實(shí)例(附源碼),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04

