詳解Spring事務(wù)回滾的兩種方法
方法一
使用
@Transaction來(lái)配置自動(dòng)回滾,可以配置在類(lèi)上,也可以配置在方法上(作用域不同),但對(duì)final或private修飾的方法無(wú)效,且該類(lèi)必須是受spring所管控的,也就是被已經(jīng)被注入的類(lèi),而不是new出來(lái)的類(lèi)。- 若配置在方法上,則該方法被加上了事務(wù)
- 若配置在類(lèi)上,則等于給該類(lèi)的所有方法都加上了該注解。此時(shí)如果在該類(lèi)下的某個(gè)方法也加了
@Transaction,則該方法使用自己的配置,其他方法使用類(lèi)上的配置。
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Override
public void save(User user) {
//some code
//db operation
}
}- 若被配置的方法或類(lèi)拋出了異常,則事務(wù)會(huì)被自動(dòng)回滾,除非你在該方法中手動(dòng)捕獲了異常,且沒(méi)有拋出新的異常。
- 可以使用
@Transactional(rollbackFor = Exception.class)來(lái)設(shè)定針對(duì)特定的異常進(jìn)行事務(wù)回滾,如果不設(shè)置則默認(rèn)會(huì)回滾 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插入失敗。
}
}方法二
通過(guò)注入 DataSourceTransactionManager 來(lái)手動(dòng)開(kāi)啟事務(wù),手動(dòng)回滾事務(wù),用于拋出異常被catch后,進(jìn)行手動(dòng)回滾,可控程度更高,可以更靈活的使用。
- 先注入
DataSourceTransactionManager事務(wù)管理對(duì)象 - new 一個(gè)
DefaultTransactionDefinition def = new DefaultTransactionDefinition();對(duì)象 - 使用
TransactionStatus status = transactionManager.getTransaction(def);來(lái)開(kāi)啟一個(gè)事務(wù), - 使用
transactionManager.rollback(status);來(lái)回滾這個(gè)事務(wù) - 使用
transactionManager.commit(status);來(lái)提交這個(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;
}
}
} // 此代碼案例來(lái)自Alibaba Coding Guidelines到此這篇關(guān)于詳解Spring事務(wù)回滾的兩種方法的文章就介紹到這了,更多相關(guān)Spring事務(wù)回滾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
原來(lái)Java接口多實(shí)現(xiàn)還可以這樣玩
JAVA中類(lèi)不直接支持多繼承,因?yàn)闀?huì)出現(xiàn)調(diào)用的不確定性,所以JAVA將多繼承機(jī)制進(jìn)行改良,在JAVA中變成了多實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于Java接口多實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2021-09-09
Object.wait()與Object.notify()的用法詳細(xì)解析
以下是對(duì)java中Object.wait()與Object.notify()的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09
SpringBoot QQ郵箱發(fā)送郵件實(shí)例代碼
大家好,本篇文章主要講的是SpringBoot QQ郵箱發(fā)送郵件實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
解決調(diào)試JDK源碼時(shí),不能查看變量的值問(wèn)題
下面小編就為大家?guī)?lái)一篇解決調(diào)試JDK源碼時(shí),不能查看變量的值問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解
今天帶小伙伴們學(xué)習(xí)一下Java并發(fā)編程之Java ConcurrentLinkedQueue源碼,本篇文章詳細(xì)分析了ConcurrentLinkedQueue源碼,有代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助喲,需要的朋友可以參考下2021-05-05
Spring?MVC傳遞json格式的數(shù)據(jù)兩種方法
文章介紹了兩種使用SpringMVC傳遞JSON數(shù)據(jù)的方法,每種方法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2026-01-01
springboot中l(wèi)ogback日志配置的詳細(xì)說(shuō)明
Logback 是一個(gè)高效、靈活的日志記錄工具,支持多種日志格式和輸出目標(biāo)(如控制臺(tái)、文件等),通過(guò)配置 logback-spring.xml 文件,可以自定義日志的輸出方式和格式,下面給大家介紹springboot中l(wèi)ogback日志配置的詳細(xì)說(shuō)明,感興趣的朋友一起看看吧2025-05-05
Java Collections.EMPTY_LIST與Collections.emptyList()的區(qū)別
這篇文章主要介紹了Java Collections.EMPTY_LIST與Collections.emptyList()的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

