詳解Spring事務回滾的兩種方法
方法一
使用
@Transaction來配置自動回滾,可以配置在類上,也可以配置在方法上(作用域不同),但對final或private修飾的方法無效,且該類必須是受spring所管控的,也就是被已經(jīng)被注入的類,而不是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 (參考自源碼內(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(); // 拋出異常,事務回滾,上面的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到此這篇關(guān)于詳解Spring事務回滾的兩種方法的文章就介紹到這了,更多相關(guān)Spring事務回滾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java19新特性中外部函數(shù)與內(nèi)存API
Java19引入的外部函數(shù)與內(nèi)存API(預覽功能)是Project Panama一部分,旨在簡化Java與本地代碼及非堆內(nèi)存的交互,提供更低層次的編程能力,解決了傳統(tǒng)JNI調(diào)用的復雜性、安全性和性能局限,特別適合高性能計算和系統(tǒng)編程領(lǐng)域,感興趣的可以了解一下2024-09-09
java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理分析
這篇文章主要介紹了java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
詳解在SpringBoot中使用MongoDb做單元測試的代碼
這篇文章主要介紹了詳解在SpringBoot中使用MongoDb做單元測試的代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11

