詳解Spring事務(wù)回滾的兩種方法
方法一
使用
@Transaction
來配置自動(dòng)回滾,可以配置在類上,也可以配置在方法上(作用域不同),但對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ù)會被自動(dòng)回滾,除非你在該方法中手動(dòng)捕獲了異常,且沒有拋出新的異常。
- 可以使用
@Transactional(rollbackFor = Exception.class)
來設(shè)定針對特定的異常進(jìn)行事務(wù)回滾,如果不設(shè)置則默認(rèn)會回滾 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ù)管理對象 - new 一個(gè)
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
對象 - 使用
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security 強(qiáng)制退出指定用戶的方法
本篇文章主要介紹了Spring Security 強(qiáng)制退出指定用戶的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03六個(gè)Java集合使用時(shí)需要注意的事項(xiàng)
這篇文章主要為大家詳細(xì)介紹了六個(gè)Java集合使用時(shí)需要注意的事項(xiàng),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)java有一定的幫助,需要的可以參考一下2023-01-01如何在Java中創(chuàng)建線程通信的四種方式你知道嗎
開發(fā)中不免會遇到需要所有子線程執(zhí)行完畢通知主線程處理某些邏輯的場景?;蛘呤蔷€程 A 在執(zhí)行到某個(gè)條件通知線程 B 執(zhí)行某個(gè)操作。下面我們來一起學(xué)習(xí)如何解決吧2021-09-09WebSocket整合SSM(Spring,Struts2,Maven)的實(shí)現(xiàn)示例
這篇文章主要介紹了WebSocket整合SSM(Spring,Struts2,Maven)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01SpringBoot使用MockMvc測試get和post接口的示例代碼
Spring Boot MockMvc是一個(gè)用于單元測試的模塊,它是Spring框架的一部分,專注于簡化Web應(yīng)用程序的測試,MockMvc主要用來模擬一個(gè)完整的HTTP請求-響應(yīng)生命周期,本文給大家介紹了SpringBoot使用MockMvc測試get和post接口,需要的朋友可以參考下2024-06-06