詳解Spring事務(wù)回滾的兩種方法
方法一
使用
@Transaction來配置自動回滾,可以配置在類上,也可以配置在方法上(作用域不同),但對final或private修飾的方法無效,且該類必須是受spring所管控的,也就是被已經(jīng)被注入的類,而不是new出來的類。- 若配置在方法上,則該方法被加上了事務(wù)
- 若配置在類上,則等于給該類的所有方法都加上了該注解。此時如果在該類下的某個方法也加了
@Transaction,則該方法使用自己的配置,其他方法使用類上的配置。
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Override
public void save(User user) {
//some code
//db operation
}
}- 若被配置的方法或類拋出了異常,則事務(wù)會被自動回滾,除非你在該方法中手動捕獲了異常,且沒有拋出新的異常。
- 可以使用
@Transactional(rollbackFor = Exception.class)來設(shè)定針對特定的異常進行事務(wù)回滾,如果不設(shè)置則默認會回滾 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 來手動開啟事務(wù),手動回滾事務(wù),用于拋出異常被catch后,進行手動回滾,可控程度更高,可以更靈活的使用。
- 先注入
DataSourceTransactionManager事務(wù)管理對象 - new 一個
DefaultTransactionDefinition def = new DefaultTransactionDefinition();對象 - 使用
TransactionStatus status = transactionManager.getTransaction(def);來開啟一個事務(wù), - 使用
transactionManager.rollback(status);來回滾這個事務(wù) - 使用
transactionManager.commit(status);來提交這個事務(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)文章
Object.wait()與Object.notify()的用法詳細解析
以下是對java中Object.wait()與Object.notify()的用法進行了詳細的分析介紹,需要的朋友可以過來參考下2013-09-09
Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解
今天帶小伙伴們學(xué)習(xí)一下Java并發(fā)編程之Java ConcurrentLinkedQueue源碼,本篇文章詳細分析了ConcurrentLinkedQueue源碼,有代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助喲,需要的朋友可以參考下2021-05-05
Spring?MVC傳遞json格式的數(shù)據(jù)兩種方法
文章介紹了兩種使用SpringMVC傳遞JSON數(shù)據(jù)的方法,每種方法結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2026-01-01
springboot中l(wèi)ogback日志配置的詳細說明
Logback 是一個高效、靈活的日志記錄工具,支持多種日志格式和輸出目標(biāo)(如控制臺、文件等),通過配置 logback-spring.xml 文件,可以自定義日志的輸出方式和格式,下面給大家介紹springboot中l(wèi)ogback日志配置的詳細說明,感興趣的朋友一起看看吧2025-05-05
Java Collections.EMPTY_LIST與Collections.emptyList()的區(qū)別
這篇文章主要介紹了Java Collections.EMPTY_LIST與Collections.emptyList()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

