網(wǎng)站制作用到什么技術(shù)seo怎么發(fā)文章 seo發(fā)布工具
在Spring Boot中,事務(wù)的管理通常通過注解來實現(xiàn),使得配置變得簡單而直觀。這種方式與Spring Boot的設(shè)計理念一致,即減少顯式配置,增加自動配置。以下是如何在Spring Boot項目中應(yīng)用和管理事務(wù)的詳細說明:
Spring Boot中的事務(wù)管理
-
Spring Boot事務(wù)基礎(chǔ)
Spring Boot沿用了Spring的事務(wù)管理概念,但在配置和使用上更為簡化,主要依賴于注解來管理事務(wù)。
1.1. Spring Boot事務(wù)特性
與傳統(tǒng)的Spring事務(wù)管理相同,Spring Boot事務(wù)也遵循ACID原則:
-
原子性(Atomicity)
-
一致性(Consistency)
-
隔離性(Isolation)
-
持久性(Durability)
1.2. 事務(wù)的隔離級別和傳播行為
Spring Boot支持相同的事務(wù)隔離級別和傳播行為,如:
-
隔離級別:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。
-
傳播行為:REQUIRED、REQUIRES_NEW、SUPPORTS等。
-
Spring Boot中的聲明式事務(wù)
2.1. 開啟事務(wù)支持
在Spring Boot中,通常通過添加@EnableTransactionManagement
注解在配置類上啟用事務(wù)管理,但在Spring Boot中這通常是不必要的,因為Spring Boot的自動配置已經(jīng)包含了事務(wù)管理的支持。
2.2. 使用@Transactional注解
-
@Transactional:這是控制事務(wù)的主要注解。它可以應(yīng)用于類或方法上。當(dāng)應(yīng)用于類上時,該類的所有公共方法將成為事務(wù)方法。
-
屬性配置:可以配置如下屬性:
-
propagation
:定義事務(wù)的傳播行為。 -
isolation
:定義事務(wù)的隔離級別。 -
timeout
:定義事務(wù)的超時時間。 -
readOnly
:標(biāo)記事務(wù)是否為只讀。 -
rollbackFor
:定義哪些異常類型會觸發(fā)事務(wù)回滾。 -
noRollbackFor
:定義哪些異常類型不會觸發(fā)事務(wù)回滾。
-
-
示例代碼
3.1. Service層事務(wù)應(yīng)用
@Service
public class UserServiceImpl implements UserService {@Transactional(rollbackFor = Exception.class)public void createUser(User user) {// 方法實現(xiàn)}@Transactional(readOnly = true)public User getUserById(Long id) {// 方法實現(xiàn)}
}
在這個例子中,createUser
方法上的@Transactional
注解指定了在發(fā)生任何Exception
時回滾事務(wù)。而getUserById
方法則是一個只讀事務(wù),這對于提高查詢操作的效率是有幫助的。
3.2. 自定義事務(wù)管理器
如果您需要自定義事務(wù)管理器,可以在配置類中定義:
@Configuration
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
在大多數(shù)情況下,您不需要這樣做,因為Spring Boot會為您自動配置事務(wù)管理器。
-
事務(wù)不生效的情況
同樣地,在Spring Boot中,如果在同一個類中,一個沒有使用事務(wù)的方法調(diào)用了一個使用了事務(wù)的方法,事務(wù)是不會生效的。這是因為事務(wù)的應(yīng)用需要通過代理來實現(xiàn),而直接的方法調(diào)用不會經(jīng)過代理。
此外,對于聲明式事務(wù),Spring默認(rèn)只對運行時異常進行回滾。如果需要對檢查型異常進行回滾,可以通過@Transactional
注解的rollbackFor
屬性來指定。
以上就是在Spring Boot項目中關(guān)于事務(wù)管理的主要內(nèi)容。Spring Boot使得事務(wù)管理變得更加
簡單,減少了大量的配置工作,同時保留了Spring事務(wù)管理的靈活性和強大功能。
傳播行為
傳播行為是指在事務(wù)環(huán)境中,方法之間相互調(diào)用時事務(wù)如何傳播。例如,當(dāng)一個事務(wù)方法被另一個事務(wù)方法調(diào)用時,是否要加入已存在的事務(wù),或者創(chuàng)建一個新的事務(wù)等。
在Spring和Spring Boot中,有幾種不同的傳播行為,例如REQUIRED
(如果當(dāng)前存在事務(wù),就加入該事務(wù);如果沒有,則創(chuàng)建一個新的事務(wù))和REQUIRES_NEW
(總是創(chuàng)建一個新的事務(wù))等。了解和合理使用這些傳播行為對于設(shè)計正確的事務(wù)策略是非常重要的。
this. 調(diào)用和事務(wù)失效問題
在Spring和Spring Boot中,事務(wù)是通過AOP代理實現(xiàn)的。當(dāng)在同一個類中,一個非事務(wù)方法內(nèi)部調(diào)用了一個事務(wù)方法時,這種this.
的調(diào)用方式將直接調(diào)用方法,而不會通過代理,導(dǎo)致事務(wù)處理失效。
解決這個問題的一種方法是使用Spring的自我注入。即在類內(nèi)部使用@Autowired
或@Resource
將自己注入進來,然后通過這個注入的實例調(diào)用事務(wù)方法,以確保通過代理:
@Service
public class MyService {@Autowiredprivate MyService myService; // 自我注入public void nonTransactionalMethod() {myService.transactionalMethod(); // 通過代理調(diào)用}@Transactionalpublic void transactionalMethod() {// 事務(wù)處理}
}
拋出非運行時異常導(dǎo)致的事務(wù)不回滾
在Spring的聲明式事務(wù)管理中,默認(rèn)情況下,只有在拋出運行時異常(繼承自RuntimeException
)和錯誤(Error
)時,事務(wù)才會回滾。如果需要讓檢查型異常(即非運行時異常,如SQLException
)也觸發(fā)事務(wù)回滾,可以通過@Transactional
注解的rollbackFor
屬性來實現(xiàn):
@Transactional(rollbackFor = Exception.class)
public void someTransactionalMethod() {// 業(yè)務(wù)邏輯
}
在這里,將rollbackFor
屬性設(shè)置為Exception.class
意味著所有類型的異常,包括非運行時異常,都會觸發(fā)事務(wù)回滾。