詳解Spring事務回滾的兩種方法
方法一
使用
@Transaction
來配置自動回滾,可以配置在類上,也可以配置在方法上(作用域不同),但對final或private修飾的方法無效,且該類必須是受spring所管控的,也就是被已經被注入的類,而不是new出來的類。- 若配置在方法上,則該方法被加上了事務
- 若配置在類上,則等于給該類的所有方法都加上了該注解。此時如果在該類下的某個方法也加了
@Transaction
,則該方法使用自己的配置,其他方法使用類上的配置。
@Service @Transactional public class UserServiceImpl implements UserService { @Override public void save(User user) { //some code //db operation } }
- 若被配置的方法或類拋出了異常,則事務會被自動回滾,除非你在該方法中手動捕獲了異常,且沒有拋出新的異常。
- 可以使用
@Transactional(rollbackFor = Exception.class)
來設定針對特定的異常進行事務回滾,如果不設置則默認會回滾 RuntimeException and Error (參考自源碼內文檔)。
@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(); // 拋出異常,事務回滾,上面的insert插入失敗。 } }
方法二
通過注入 DataSourceTransactionManager
來手動開啟事務,手動回滾事務,用于拋出異常被catch后,進行手動回滾,可控程度更高,可以更靈活的使用。
- 先注入
DataSourceTransactionManager
事務管理對象 - new 一個
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
對象 - 使用
TransactionStatus status = transactionManager.getTransaction(def);
來開啟一個事務, - 使用
transactionManager.rollback(status);
來回滾這個事務 - 使用
transactionManager.commit(status);
來提交這個事務
@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
到此這篇關于詳解Spring事務回滾的兩種方法的文章就介紹到這了,更多相關Spring事務回滾內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何在Java中創(chuàng)建線程通信的四種方式你知道嗎
開發(fā)中不免會遇到需要所有子線程執(zhí)行完畢通知主線程處理某些邏輯的場景。或者是線程 A 在執(zhí)行到某個條件通知線程 B 執(zhí)行某個操作。下面我們來一起學習如何解決吧2021-09-09WebSocket整合SSM(Spring,Struts2,Maven)的實現示例
這篇文章主要介紹了WebSocket整合SSM(Spring,Struts2,Maven)的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-01-01SpringBoot使用MockMvc測試get和post接口的示例代碼
Spring Boot MockMvc是一個用于單元測試的模塊,它是Spring框架的一部分,專注于簡化Web應用程序的測試,MockMvc主要用來模擬一個完整的HTTP請求-響應生命周期,本文給大家介紹了SpringBoot使用MockMvc測試get和post接口,需要的朋友可以參考下2024-06-06