詳解Spring事務(wù)回滾的兩種方法
方法一
使用
@Transaction來配置自動(dòng)回滾,可以配置在類上,也可以配置在方法上(作用域不同),但對(duì)final或private修飾的方法無效,且該類必須是受spring所管控的,也就是被已經(jīng)被注入的類,而不是new出來的類。- 若配置在方法上,則該方法被加上了事務(wù)
- 若配置在類上,則等于給該類的所有方法都加上了該注解。此時(shí)如果在該類下的某個(gè)方法也加了
@Transaction,則該方法使用自己的配置,其他方法使用類上的配置。
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Override
public void save(User user) {
//some code
//db operation
}
}- 若被配置的方法或類拋出了異常,則事務(wù)會(huì)被自動(dòng)回滾,除非你在該方法中手動(dòng)捕獲了異常,且沒有拋出新的異常。
- 可以使用
@Transactional(rollbackFor = Exception.class)來設(shè)定針對(duì)特定的異常進(jìn)行事務(wù)回滾,如果不設(shè)置則默認(rèn)會(huì)回滾 RuntimeException and Error (參考自源碼內(nèi)文檔)。
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public void save(User user) {
userMapper.insert(user);
throw new RuntimeException(); // 拋出異常,事務(wù)回滾,上面的insert插入失敗。
}
}方法二
通過注入 DataSourceTransactionManager 來手動(dòng)開啟事務(wù),手動(dòng)回滾事務(wù),用于拋出異常被catch后,進(jìn)行手動(dòng)回滾,可控程度更高,可以更靈活的使用。
- 先注入
DataSourceTransactionManager事務(wù)管理對(duì)象 - new 一個(gè)
DefaultTransactionDefinition def = new DefaultTransactionDefinition();對(duì)象 - 使用
TransactionStatus status = transactionManager.getTransaction(def);來開啟一個(gè)事務(wù), - 使用
transactionManager.rollback(status);來回滾這個(gè)事務(wù) - 使用
transactionManager.commit(status);來提交這個(gè)事務(wù)
@Service
public class UserServiceImpl implements UserService {
@Autowired
private DataSourceTransactionManager transactionManager;
@Override
@Transactional
public void save(User user) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
// execute your business logic here
//db operation
} catch (Exception ex) {
transactionManager.rollback(status);
throw ex;
}
}
} // 此代碼案例來自Alibaba Coding Guidelines到此這篇關(guān)于詳解Spring事務(wù)回滾的兩種方法的文章就介紹到這了,更多相關(guān)Spring事務(wù)回滾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java19新特性中外部函數(shù)與內(nèi)存API
Java19引入的外部函數(shù)與內(nèi)存API(預(yù)覽功能)是Project Panama一部分,旨在簡化Java與本地代碼及非堆內(nèi)存的交互,提供更低層次的編程能力,解決了傳統(tǒng)JNI調(diào)用的復(fù)雜性、安全性和性能局限,特別適合高性能計(jì)算和系統(tǒng)編程領(lǐng)域,感興趣的可以了解一下2024-09-09
java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理分析
這篇文章主要介紹了java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
在SpringBoot中使用MongoDB的簡單場(chǎng)景案例
MongoDB 是一種非關(guān)系型數(shù)據(jù)庫,也被稱為 NoSQL 數(shù)據(jù)庫,它主要以文檔的形式存儲(chǔ)數(shù)據(jù),本文給大家介紹了在SpringBoot中使用MongoDB的簡單場(chǎng)景案例,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-09-09
SpringBoot全局異常處理之解決404/500錯(cuò)誤
在搭建項(xiàng)目框架的時(shí)候用的是springboot,想統(tǒng)一處理異常,但是發(fā)現(xiàn)404的錯(cuò)誤總是捕捉不到,總是返回的是springBoot自帶的錯(cuò)誤結(jié)果信息,這篇文章主要給大家介紹了關(guān)于SpringBoot全局異常處理之解決404/500錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2023-11-11
詳解在SpringBoot中使用MongoDb做單元測(cè)試的代碼
這篇文章主要介紹了詳解在SpringBoot中使用MongoDb做單元測(cè)試的代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java滾動(dòng)數(shù)組計(jì)算編輯距離操作示例
這篇文章主要介紹了Java滾動(dòng)數(shù)組計(jì)算編輯距離操作,涉及java字符串與數(shù)組的遍歷、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12

