Spring中@Transactional注解關(guān)鍵屬性和用法小結(jié)
在Spring框架中,@Transactional
是一個注解,用于聲明事務(wù)性的方法。這個注解可以被應(yīng)用在方法級別或類級別上。它提供了一種聲明式的事務(wù)管理方式,避免了在代碼中直接編寫事務(wù)管理相關(guān)的代碼。@Transactional
注解能夠?qū)⒁粋€方法納入到一個事務(wù)中,使其成為一個事務(wù)性方法。
以下是 @Transactional
注解的一些關(guān)鍵屬性和用法:
關(guān)鍵屬性和用法
1. Propagation(傳播行為):
- 定義了事務(wù)方法的執(zhí)行期間,當(dāng)前事務(wù)傳播到被調(diào)用的方法。
- 常用的傳播行為包括
REQUIRED
(如果有事務(wù),則加入;沒有事務(wù),則新建一個)和REQUIRES_NEW
(每次都新建一個事務(wù),掛起當(dāng)前事務(wù))。
@Transactional(propagation = Propagation.REQUIRED) public void transactionalMethod() { // 方法體 }
2. Isolation(隔離級別):
- 定義了事務(wù)的隔離級別,即多個事務(wù)并發(fā)執(zhí)行時,事務(wù)之間的隔離程度。
- 常用的隔離級別包括
READ_COMMITTED
(允許讀取已提交的數(shù)據(jù),避免臟讀)和SERIALIZABLE
(最高的隔離級別,保證事務(wù)的完全隔離)。
@Transactional(isolation = Isolation.READ_COMMITTED) public void transactionalMethod() { // 方法體 }
3. ReadOnly(只讀):
指定事務(wù)是否為只讀事務(wù)。如果設(shè)置為 true
,則表示這個事務(wù)只讀取數(shù)據(jù)但不更新數(shù)據(jù),可以提高事務(wù)的性能。
@Transactional(readOnly = true) public void readOnlyTransactionalMethod() { // 方法體 }
4. Timeout(超時):
定義了事務(wù)的超時時間,即事務(wù)方法的執(zhí)行時間超過了這個值,事務(wù)將被回滾。
@Transactional(timeout = 60) // 60 秒超時 public void transactionalMethod() { // 方法體 }
5. RollbackFor(回滾異常):
指定哪些異常觸發(fā)事務(wù)回滾??梢灾付ǘ鄠€異常類型。
@Transactional(rollbackFor = {SQLException.class, IOException.class}) public void transactionalMethod() throws SQLException, IOException { // 方法體 }
6. NoRollbackFor(不回滾異常):
指定哪些異常不觸發(fā)事務(wù)回滾。同樣可以指定多個異常類型。
@Transactional(noRollbackFor = BusinessException.class) public void transactionalMethod() throws BusinessException { // 方法體 }
使用方法:
在類級別使用 @Transactional
:
@Service @Transactional public class MyService { // 方法 }
在方法級別使用 @Transactional
:
@Service public class MyService { @Transactional public void myTransactionalMethod() { // 方法體 } }
事務(wù)回滾
事務(wù)回滾是指在事務(wù)執(zhí)行過程中發(fā)生了某些錯誤或異常,系統(tǒng)會撤銷當(dāng)前事務(wù)的所有操作,使數(shù)據(jù)回滾到事務(wù)開始之前的狀態(tài)。
事務(wù)回滾的作用是確保事務(wù)的一致性和完整性。如果在事務(wù)中發(fā)生了錯誤,事務(wù)回滾可以防止數(shù)據(jù)的部分更新,確保數(shù)據(jù)庫的一致性。
何時會觸發(fā)事務(wù)回滾:
Unchecked 異常: 默認(rèn)情況下,Spring @Transactional
注解只會在遇到未檢查(unchecked)異常時觸發(fā)事務(wù)回滾。未檢查異常是指繼承自 RuntimeException
的異常,如 NullPointerException
、ArithmeticException
等。
@Transactional public void transactionalMethod() { // 發(fā)生未檢查異常時,事務(wù)將回滾 throw new RuntimeException("Something went wrong"); }
指定回滾條件: 通過 rollbackFor
或 noRollbackFor
屬性,可以在 @Transactional
注解上指定哪些異常觸發(fā)事務(wù)回滾或不觸發(fā)事務(wù)回滾。
@Transactional(rollbackFor = {SQLException.class, IOException.class}) public void transactionalMethod() throws SQLException, IOException { // 發(fā)生指定異常時,事務(wù)將回滾 throw new SQLException("Database error"); }
Checked 異常: 如果需要回滾事務(wù)的是受檢查的異常(checked exception),可以使用 @Transactional(rollbackFor = Exception.class)
,但這并不是通常的做法,因?yàn)橥ǔG闆r下事務(wù)回滾更關(guān)注未檢查異常。
@Transactional(rollbackFor = Exception.class)
表示在使用 Spring 的聲明式事務(wù)管理時,如果發(fā)生任何Exception
及其子類的異常,都會導(dǎo)致事務(wù)回滾。這意味著如果在被注解的方法中拋出了任何Exception
,不管是 checked 還是 unchecked 異常,都會觸發(fā)事務(wù)回滾。- 這種設(shè)置的意義在于,有時候我們可能希望對于某些異常情況,即便是 checked 異常,也觸發(fā)事務(wù)回滾。通常情況下,Spring 默認(rèn)只對未檢查異常(
RuntimeException
及其子類)進(jìn)行回滾。通過設(shè)置rollbackFor = Exception.class
,我們擴(kuò)大了回滾的范圍,即使是 checked 異常也會導(dǎo)致事務(wù)回滾。
例子:
@Transactional(rollbackFor = Exception.class) public void transactionalMethod() throws CustomCheckedException { // 操作數(shù)據(jù)庫 // 拋出 checked 異常,事務(wù)將回滾 throw new CustomCheckedException("Custom checked exception"); }
在上述例子中,即使 CustomCheckedException
是一個 checked 異常,由于設(shè)置了 rollbackFor = Exception.class
,這個方法拋出的異常也會導(dǎo)致事務(wù)回滾。
需要注意的是,過度使用這樣的設(shè)置可能會導(dǎo)致意外的結(jié)果,因?yàn)槟承?checked 異常可能是可以被業(yè)務(wù)邏輯處理的。因此,一般來說,建議在 rollbackFor
中指定具體的異常類型,而不是將其設(shè)置為 Exception.class
。
- 一致性: 在事務(wù)中的一組操作,要么全部執(zhí)行,要么全部不執(zhí)行。回滾確保了數(shù)據(jù)的一致性。
- 完整性: 回滾可以防止數(shù)據(jù)的部分更新,保證了數(shù)據(jù)庫的完整性。
- 可靠性: 當(dāng)出現(xiàn)異?;蝈e誤時,回滾確保了系統(tǒng)的可靠性,避免了數(shù)據(jù)不一致或丟失。
與 try-catch 的關(guān)系:
在事務(wù)性方法中,通常不需要顯式地使用 try-catch 塊來捕獲異常,因?yàn)?Spring 會在檢測到未檢查異常時觸發(fā)事務(wù)回滾。如果在事務(wù)性方法中使用了 try-catch 塊,并成功捕獲了異常,Spring 將不會觸發(fā)事務(wù)回滾。在這種情況下,你可以手動調(diào)用 setRollbackOnly
方法來指示事務(wù)回滾。
@Transactional public void transactionalMethod() { try { // 操作數(shù)據(jù)庫 } catch (Exception e) { // 捕獲異常,不觸發(fā)事務(wù)回滾 // 手動指示事務(wù)回滾 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
@Transactional 沒有拋出異常時是否管用:
如果 @Transactional
注解所標(biāo)注的方法沒有拋出未檢查異常,并且方法成功完成,那么事務(wù)會正常提交,而不會回滾。@Transactional
不僅用于處理異常,還用于確保事務(wù)的一致性,即一組操作要么全部成功,要么全部失敗。在沒有異常拋出的情況下,@Transactional
也能夠確保事務(wù)的完整性。
到此這篇關(guān)于Spring中@Transactional注解的文章就介紹到這了,更多相關(guān)Spring @Transactional注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring源碼閱讀--@Transactional實(shí)現(xiàn)原理講解
這篇文章主要介紹了spring源碼閱讀--@Transactional實(shí)現(xiàn)原理講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot全局異常與數(shù)據(jù)校驗(yàn)的方法
這篇文章主要介紹了SpringBoot全局異常與數(shù)據(jù)校驗(yàn)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11springboot 單文件上傳的實(shí)現(xiàn)步驟
這篇文章主要介紹了springboot實(shí)現(xiàn)單文件上傳的方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2021-02-02Spring中@ConditionalOnProperty注解的作用詳解
這篇文章主要介紹了Spring中@ConditionalOnProperty注解的作用詳解,@ConditionalOnProperty注解主要是用來判斷配置文件中的內(nèi)容來決定配置類是否生效用的,如果條件不匹配,則配置類不生效,需要的朋友可以參考下2024-01-01springboot+redis緩存的實(shí)現(xiàn)方案
本文介紹了Spring Boot與Redis結(jié)合實(shí)現(xiàn)緩存的三種方案:注解方式、注解切面類方式和使用樣例,通過這些方案,可以有效地提高應(yīng)用程序的性能和響應(yīng)速度2025-03-03Spring實(shí)戰(zhàn)之獲得Bean本身的id操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之獲得Bean本身的id操作,結(jié)合實(shí)例形式分析了spring獲取Bean本身id的相關(guān)配置與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-11-11java利用delayedQueue實(shí)現(xiàn)本地的延遲隊(duì)列
這篇文章主要給大家介紹了java利用delayedQueue實(shí)現(xiàn)本地的延遲隊(duì)列的相關(guān)資料,文中介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04