Spring是一個基於Java平台的應用程序框架,既可以用於創建Java企業級應用程序,又可以作為IoC容器使用。Spring的一個重要特性就是支持事務管理。Spring事務管理比較靈活,並且提供了多種管理事務的方式。其中,手動提交事務也是比較常見的一種方式。
一、Spring手動提交事務的方法
Spring手動提交事務的方式一般分為以下三個步驟:
- 獲取TransactionStatus對象
- 執行業務邏輯操作
- 手動提交或回滾事務
獲取TransactionStatus對象可以通過TransactionTemplate類的execute()方法實現:
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); TransactionStatus status = transactionTemplate.getTransaction(null);
其中,transactionManager是一個DataSourceTransactionManager對象,用於管理事務。execute()方法的第一個參數是一個TransactionCallback對象,用於執行業務邏輯操作。
執行業務邏輯操作時,可以在TransactionCallback的doInTransaction()方法中實現:
transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { //執行業務邏輯操作 } });
手動提交或回滾事務,則可以通過TransactionStatus對象的commit()和rollback()方法實現:
if (status.isCompleted()) { transactionTemplate.getTransactionManager().commit(status); } else { transactionTemplate.getTransactionManager().rollback(status); }
二、Spring手動提交事務未關閉
在使用Spring手動提交事務時,需要注意的一個問題是:如果手動提交事務後,是否還需要手動關閉事務?
答案是不需要。因為在使用Spring時,事務管理器會自動關閉事務,而且手動提交事務後,也不能再執行其他事務操作。
三、Spring註解手動提交事務
Spring還支持使用註解來控制事務的提交。使用註解進行事務控制比較簡單,並且可以避免手動提交事務時出錯的風險。
使用註解在方法中添加@Transactional註解即可:
@Transactional(rollbackFor = Exception.class) public void doInTransaction() { //執行業務邏輯操作 }
其中,rollbackFor用於設置事務回滾的條件,這裡設置為Exception.class,表示當出現異常時進行回滾。
四、Spring手動回滾事務
在一些特殊情況下,需要手動回滾事務,比如出現了業務異常或其它不可預料的情況。在使用Spring手動提交事務時,同樣也可以手動回滾事務。
在事務管理時,如果需要手動回滾事務,可以通過TransactionStatus對象的setRollbackOnly()方法設置:
status.setRollbackOnly();
設置setRollbackOnly()方法後,下一次提交事務時就會自動回滾事務。
五、Spring顯示提交事務
在使用Spring進行事務管理時,事務默認是在方法執行結束後才進行提交。但是,在一些需要在方法執行中進行多次提交的場景下,就需要使用顯示提交事務。
使用顯示提交事務可以通過TransactionStatus對象的flush()方法實現:
status.flush();
調用flush()方法後,事務會立即提交,而不需要等到方法執行結束後再提交。
六、Spring會自動提交事務嗎
在使用Spring進行事務管理時,事務默認是在方法執行結束後才進行提交。但是,這裡的提交並不是指自動提交事務,而是指自動提交事務的一種方式。
其實,Spring默認不會自動提交事務。但是,在一些情況下,比如使用了JPA的保存操作(entityManager.persist())時,JPA會默認使用自動提交事務的方式,這種情況下需要注意。
七、Spring手動事務
Spring提供了多種事務管理方式,包括聲明式事務和編程式事務。而使用Spring手動提交事務就是一種編程式事務管理方式。
使用Spring手動提交事務,可以手動控制事務的提交和回滾,靈活性較高,但也需要考慮到處理事務的正確性和風險。
八、SpringBoot事物提交
在使用SpringBoot開發應用時,同樣也需要進行事務管理。比較常用的方式是在方法上添加@Transactional註解,聲明式地管理事務。
使用@Transactional註解時,建議使用noRollbackFor屬性來指定不需要回滾的異常:
@Transactional(noRollbackFor = {NullPointerException.class}) public void doInTransaction() { //執行業務邏輯操作 }
其中,noRollbackFor屬性用於設置不需要回滾的異常,比如這裡設置了NullPointerException.class,表示當遇到NullPointerException時不進行回滾。
原創文章,作者:YLRH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133338.html