it公司怎么在國外網(wǎng)站做宣傳建設(shè)網(wǎng)站制作
Spring Boot 事務(wù)管理
- 一、Spring Boot中的事務(wù)管理
- 1.聲明式事務(wù)管理
- @Transactional注解
- 基本使用
- 配置選項(xiàng)
- 2.編程式事務(wù)管理
- TransactionTemplate
- PlatformTransactionManager
- 二、@Transactional注解深入
- 1.基本使用
- 基本屬性
- 2.傳播行為
- 3.隔離級別
- 4.事務(wù)超時(shí)設(shè)置
- 5.回滾規(guī)則
- 三、事務(wù)管理的最佳實(shí)踐
- 1.事務(wù)邊界的確定
- 2.只讀事務(wù)的使用
- 3.避免編程式事務(wù)
一、Spring Boot中的事務(wù)管理
1.聲明式事務(wù)管理
@Transactional注解
Spring最常用的事務(wù)管理方式是聲明式事務(wù)管理,主要通過@Transactional注解實(shí)現(xiàn)。這種方式的優(yōu)點(diǎn)在于簡單易用,通過將注解添加到類或方法上,開發(fā)者可以輕松地控制事務(wù)的邊界,而無需直接與底層的事務(wù)管理API打交道。
基本使用
在方法級別上使用@Transactional注解,可以確保該方法內(nèi)的所有操作要么全部成功,要么在遇到異常時(shí)全部回滾。
import org.springframework.transaction.annotation.Transactional;@Transactional
public void updateUserData(User user) {// 這里的數(shù)據(jù)庫操作會在一個(gè)事務(wù)中執(zhí)行
}
配置選項(xiàng)
@Transactional注解提供了多種配置選項(xiàng),包括事務(wù)的傳播行為、隔離級別、超時(shí)設(shè)置等。
2.編程式事務(wù)管理
使用TransactionTemplate或直接使用PlatformTransactionManager,可以在代碼中精確控制事務(wù)的邊界。
TransactionTemplate
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.support.TransactionTemplate;public class UserService {@Autowiredprivate TransactionTemplate transactionTemplate;public User createUser(final User user) {return transactionTemplate.execute(status -> {// 這里的操作會在一個(gè)事務(wù)中執(zhí)行return userRepository.save(user);});}
}
PlatformTransactionManager
對于需要完全控制事務(wù)行為的場景,Spring還允許直接使用PlatformTransactionManager。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;public class UserServiceImpl implements UserService {@Autowiredprivate PlatformTransactionManager transactionManager;public void updateUser(User user) {TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());try {// 這里的操作會在一個(gè)事務(wù)中執(zhí)行userRepository.update(user);transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);throw e;}}
}
二、@Transactional注解深入
1.基本使用
@Transactional
注解可以應(yīng)用于類或方法級別。當(dāng)應(yīng)用于類級別時(shí),該類中的所有公共方法都會被應(yīng)用事務(wù)管理。當(dāng)應(yīng)用于方法級別時(shí),只有標(biāo)注了該注解的方法才會進(jìn)行事務(wù)管理。
基本屬性
readOnly
: 指定事務(wù)是否為只讀事務(wù)。只讀事務(wù)可以幫助數(shù)據(jù)庫引擎優(yōu)化事務(wù)。propagation
: 指定事務(wù)的傳播行為。isolation
: 指定事務(wù)的隔離級別。timeout
: 定義事務(wù)的超時(shí)限制(以秒為單位)。rollbackFor
: 指定哪些異??梢杂|發(fā)事務(wù)回滾。noRollbackFor
: 指定哪些異常不應(yīng)觸發(fā)事務(wù)回滾。
2.傳播行為
事務(wù)的傳播行為定義了事務(wù)邊界的創(chuàng)建方式。Spring定義了多種傳播行為:
REQUIRED
: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。SUPPORTS
: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)方式執(zhí)行。MANDATORY
: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。REQUIRES_NEW
: 總是創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù)。NOT_SUPPORTED
: 總是以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù)。NEVER
: 總是以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。NESTED
: 如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則表現(xiàn)同REQUIRED
。
3.隔離級別
隔離級別定義了一個(gè)事務(wù)可能受其他并發(fā)事務(wù)影響的程度。Spring支持以下隔離級別:
DEFAULT
: 使用底層數(shù)據(jù)源的默認(rèn)隔離級別。READ_UNCOMMITTED
: 允許讀取未提交的更改。READ_COMMITTED
: 僅允許讀取已提交的更改。REPEATABLE_READ
: 確保在事務(wù)內(nèi)重復(fù)讀取同一記錄的結(jié)果一致。SERIALIZABLE
: 完全隔離,確保事務(wù)串行化執(zhí)行。
4.事務(wù)超時(shí)設(shè)置
通過@Transactional
注解的timeout
屬性,可以為事務(wù)指定超時(shí)時(shí)間。如果事務(wù)執(zhí)行時(shí)間超過了指定的時(shí)間限制,Spring將自動回滾事務(wù)。
5.回滾規(guī)則
通過@Transactional
注解的rollbackFor
和noRollbackFor
屬性,可以精確控制異?;貪L行為:
rollbackFor
: 指定哪些異常應(yīng)該觸發(fā)事務(wù)回滾。noRollbackFor
: 指定哪些異常不應(yīng)該觸發(fā)事務(wù)回滾。
三、事務(wù)管理的最佳實(shí)踐
1.事務(wù)邊界的確定
事務(wù)邊界定義了事務(wù)的開始和結(jié)束,合理的事務(wù)邊界可以確保事務(wù)既不過大也不過小。
- 定義清晰的業(yè)務(wù)邏輯單元:每個(gè)事務(wù)應(yīng)該對應(yīng)一個(gè)清晰定義的業(yè)務(wù)邏輯單元。不應(yīng)該讓一個(gè)事務(wù)覆蓋多個(gè)不相關(guān)的操作。
- 避免長事務(wù):長事務(wù)會占用數(shù)據(jù)庫資源,增加鎖定的范圍和時(shí)間,從而影響并發(fā)性能。盡量避免不必要的長事務(wù),及時(shí)提交或回滾。
- 事務(wù)中的操作數(shù)量:雖然理論上事務(wù)可以包含任意數(shù)量的操作,但是在實(shí)踐中,應(yīng)該避免在單一事務(wù)中包含過多的操作。如果業(yè)務(wù)邏輯允許,可以將一個(gè)大事務(wù)分解為幾個(gè)小事務(wù),以提高并發(fā)性和系統(tǒng)穩(wěn)定性。
2.只讀事務(wù)的使用
只讀事務(wù)是指不包含任何修改(插入、更新、刪除)操作的事務(wù)。只讀事務(wù)的使用有以下好處:
- 性能優(yōu)化:數(shù)據(jù)庫可以對只讀事務(wù)進(jìn)行優(yōu)化,如減少鎖的使用,提升查詢性能。
- 減少副作用:標(biāo)記為只讀的事務(wù)明確告訴數(shù)據(jù)庫和應(yīng)用程序這個(gè)事務(wù)不會修改數(shù)據(jù),有助于避免由于錯(cuò)誤的數(shù)據(jù)修改導(dǎo)致的問題。
何時(shí)使用只讀事務(wù):
- 數(shù)據(jù)查詢操作:當(dāng)事務(wù)僅包含數(shù)據(jù)查詢操作,不涉及任何數(shù)據(jù)修改時(shí),應(yīng)將事務(wù)標(biāo)記為只讀。
- 報(bào)表生成:生成報(bào)表或執(zhí)行大量查詢以分析數(shù)據(jù)時(shí),使用只讀事務(wù)可以提高效率。
3.避免編程式事務(wù)
盡管Spring提供了編程式事務(wù)管理的能力,但在大多數(shù)情況下,推薦使用聲明式事務(wù)管理(@Transactional注解)原因如下:
- 簡化開發(fā):聲明式事務(wù)管理通過注解的方式,減少了編程的復(fù)雜度,使得事務(wù)管理更加直觀和易于理解。
- 減少代碼侵入性:使用聲明式事務(wù)管理,事務(wù)代碼與業(yè)務(wù)代碼分離,降低了代碼的耦合度,提高了代碼的可讀性和可維護(hù)性。
- 統(tǒng)一事務(wù)管理:聲明式事務(wù)管理提供了一種統(tǒng)一的事務(wù)管理機(jī)制,使得事務(wù)管理更加標(biāo)準(zhǔn)化,易于跟蹤和維護(hù)。