SpringBoot中的事務(wù)回滾規(guī)則詳解
什么是事務(wù)回滾
事務(wù)回滾是指當(dāng)事務(wù)執(zhí)行失敗時,將所有已經(jīng)執(zhí)行的操作全部撤銷,使它們回到事務(wù)開始時的狀態(tài)。
這樣可以保證數(shù)據(jù)的一致性和完整性。在Spring Boot中,事務(wù)回滾是由Spring框架來實現(xiàn)的。
Spring Boot 中的事務(wù)回滾規(guī)則
Spring Boot默認(rèn)情況下,只有在拋出RuntimeException或Error時,才會發(fā)生事務(wù)回滾。
這是因為RuntimeException和Error通常是由Java虛擬機拋出的,它們是無法被捕獲的異常,因此Spring無法對它們進(jìn)行處理,只能回滾事務(wù)。
在Spring Boot中,我們可以使用@Transactional注解來控制事務(wù)的回滾。這個注解可以放在方法上,也可以放在類上。
如果它放在類上,那么所有的方法都將繼承這個注解。
@Transactional注解有一些非常重要的屬性,包括rollbackFor和noRollbackFor。rollbackFor用來指定哪些異常會觸發(fā)事務(wù)回滾,noRollbackFor用來指定哪些異常不會觸發(fā)事務(wù)回滾。
@Transactional(rollbackFor = Exception.class, noRollbackFor = RuntimeException.class)
public void doSomething() {
// ...
}在上面的代碼中,rollbackFor屬性指定了所有的異常都會觸發(fā)事務(wù)回滾,而noRollbackFor屬性指定了RuntimeException和其子類的異常不會觸發(fā)事務(wù)回滾。
另外,Spring Boot還提供了一個@Transactional(propagation = Propagation.REQUIRED)注解,用來控制事務(wù)的傳播行為。
這個注解有很多屬性,其中最常用的是Propagation.REQUIRED。它表示如果當(dāng)前已經(jīng)存在一個事務(wù),那么就使用這個事務(wù);如果當(dāng)前不存在事務(wù),那么就創(chuàng)建一個新的事務(wù)。
Spring Boot 中的事務(wù)原理
在Spring Boot中,事務(wù)是由Spring框架來管理的。Spring框架使用了AOP(面向切面編程)技術(shù)來實現(xiàn)事務(wù)的管理。
具體來說,Spring框架通過代理機制來實現(xiàn)事務(wù)的管理。
當(dāng)一個方法被@Transactional注解修飾時,Spring會為這個方法創(chuàng)建一個代理對象。
當(dāng)這個方法被調(diào)用時,實際上是調(diào)用了代理對象的方法。
代理對象在方法執(zhí)行前會開啟一個事務(wù),在方法執(zhí)行后根據(jù)執(zhí)行結(jié)果來決定是提交事務(wù)還是回滾事務(wù)。
Spring框架使用了一個TransactionInterceptor攔截器來實現(xiàn)事務(wù)管理。
這個攔截器會在方法執(zhí)行前后進(jìn)行攔截,并根據(jù)事務(wù)的傳播行為和異常情況來決定是開啟一個新的事務(wù)還是使用已經(jīng)存在的事務(wù),并在方法執(zhí)行后根據(jù)執(zhí)行結(jié)果來決定是提交事務(wù)還是回滾事務(wù)。
Spring Boot 中的事務(wù)使用
在Spring Boot中,我們可以使用@Transactional注解來控制事務(wù)的回滾。
在使用@Transactional注解時,需要注意以下幾點:
- @Transactional注解只能放在public方法上。
- 方法必須是非靜態(tài)的。
- 如果在同一個類中調(diào)用了帶有@Transactional注解的方法,那么事務(wù)將不會起作用。這是因為Spring是通過代理來實現(xiàn)事務(wù)管理的,而代理只能在方法調(diào)用時生效。
- 如果在一個類中同時存在多個帶有@Transactional注解的方法,那么這些方法將共享同一個事務(wù)。
- 在使用@Transactional注解時,一定要確保注解配置正確,否則可能會導(dǎo)致事務(wù)無法回滾或者回滾不完全的情況。
下面是一個使用@Transactional注解的例子:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional(rollbackFor = Exception.class)
public void addUser(User user) {
userRepository.save(user);
// ...
}
}在上面的例子中,addUser()方法使用了@Transactional注解來控制事務(wù)的回滾。
如果在方法執(zhí)行過程中發(fā)生了異常,那么事務(wù)將會回滾,保證數(shù)據(jù)的一致性和完整性。
除了使用@Transactional注解外,Spring Boot還提供了一些其他的方式來管理事務(wù),包括編程式事務(wù)管理和聲明式事務(wù)管理。這些方式的具體實現(xiàn)可以參考Spring Boot官方文檔。
總結(jié)
事務(wù)回滾是保證數(shù)據(jù)的一致性和完整性的重要手段。在Spring Boot中,事務(wù)回滾是由Spring框架來實現(xiàn)的。
Spring框架使用了AOP技術(shù)來實現(xiàn)事務(wù)的管理,通過代理對象來控制事務(wù)的回滾。
在使用事務(wù)時,我們可以使用@Transactional注解來控制事務(wù)的回滾,同時也需要注意注解的配置和使用方式。
除了使用@Transactional注解外,Spring Boot還提供了其他的方式來管理事務(wù),開發(fā)者可以根據(jù)具體情況選擇最適合自己的方式。
到此這篇關(guān)于SpringBoot中的事務(wù)回滾規(guī)則詳解的文章就介紹到這了,更多相關(guān)SpringBoot事務(wù)回滾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven打包沒有指定主類問題(xxx.jar中沒有主清單屬性)
這篇文章主要介紹了Maven打包沒有指定主類問題(xxx.jar中沒有主清單屬性),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot公共字段自動填充實現(xiàn)與避坑指南
在開發(fā)外賣系統(tǒng)訂單模塊時,我發(fā)現(xiàn)每個實體類都包含create_time、update_by等重復(fù)字段,手動維護(hù)這些字段不僅效率低下,還容易出錯,本文將分享一套經(jīng)過生產(chǎn)驗證的自動化方案,助你徹底擺脫公共字段維護(hù)的煩惱,需要的朋友可以參考下2025-05-05
SpringSecurity rememberme功能實現(xiàn)過程解析
這篇文章主要介紹了SpringSecurity rememberme功能實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Mybatis中的PageHelper的執(zhí)行流程分析
這篇文章主要介紹了Mybatis的PageHelper執(zhí)行流程,本文給大家介紹介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
Java項目導(dǎo)出數(shù)據(jù)為 PDF 文件的操作代碼
一個小需求,需要將頁面上的數(shù)據(jù)導(dǎo)出為PDF,正常情況下這個需求需要讓前端來做,但是現(xiàn)在上面讓咱們后端來做,也沒問題,這篇文章主要介紹了Java項目導(dǎo)出數(shù)據(jù)為 PDF 文件的操作代碼,需要的朋友可以參考下2022-12-12
Java動態(tài)線程池插件dynamic-tp集成zookeeper
ZooKeeper是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個開源的實現(xiàn),是Hadoop和Hbase的重要組件。它是一個為分布式應(yīng)用提供一致性的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等2023-03-03

