Spring如何實現(xiàn)管理事務(wù)
spring通過編程式事務(wù)和聲明式事務(wù)管理來控制事務(wù)的邊界和行為。
1. 事務(wù)管理器
Spring 通過事務(wù)管理器(Transaction Manager)來管理事務(wù)。不同的持久化技術(shù)(如 JDBC、JPA、Hibernate)對應(yīng)不同的事務(wù)管理器,例如:
DataSourceTransactionManager
:用于管理 JDBC 事務(wù)。JpaTransactionManager
:用于管理 JPA 事務(wù)。HibernateTransactionManager
:用于管理 Hibernate 事務(wù)。
事務(wù)管理器是 Spring 事務(wù)管理的核心,它負(fù)責(zé)處理事務(wù)的開始、提交和回滾。
2. 編程式事務(wù)管理
編程式事務(wù)管理是指在代碼中顯式地管理事務(wù),通常使用 TransactionTemplate
或者底層的 PlatformTransactionManager
。
使用 TransactionTemplate
@Autowired private TransactionTemplate transactionTemplate; public void someMethod() { transactionTemplate.execute(status -> { // 執(zhí)行業(yè)務(wù)邏輯 // status.setRollbackOnly(); // 回滾事務(wù) return null; }); }
使用 PlatformTransactionManager
@Autowired private PlatformTransactionManager transactionManager; public void someMethod() { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(def); try { // 執(zhí)行業(yè)務(wù)邏輯 transactionManager.commit(status); // 提交事務(wù) } catch (Exception e) { transactionManager.rollback(status); // 回滾事務(wù) } }
3. 聲明式事務(wù)管理
聲明式事務(wù)管理是通過 AOP(面向切面編程)和注解來管理事務(wù),通常使用 @Transactional
注解。
這種方式更加簡潔和方便,推薦使用。
使用 @Transactional 注解
import org.springframework.transaction.annotation.Transactional; @Service public class MyService { @Transactional public void someMethod() { // 執(zhí)行業(yè)務(wù)邏輯 } }
@Transactional
注解可以應(yīng)用于類或方法上,它的主要屬性包括:
propagation
:事務(wù)的傳播行為,定義事務(wù)如何傳播。常用的傳播行為包括:REQUIRED
(默認(rèn)):如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新事務(wù)。REQUIRES_NEW
:總是創(chuàng)建一個新事務(wù),如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù)。SUPPORTS
:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)方式執(zhí)行。NOT_SUPPORTED
:總是以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù)。MANDATORY
:必須在事務(wù)中執(zhí)行,如果當(dāng)前沒有事務(wù),則拋出異常。NEVER
:必須在非事務(wù)中執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。NESTED
:如果當(dāng)前存在事務(wù),則創(chuàng)建一個嵌套事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新事務(wù)。
isolation
:事務(wù)的隔離級別,定義一個事務(wù)可以受到其他事務(wù)影響的程度。常用的隔離級別包括:DEFAULT
(默認(rèn)):使用底層數(shù)據(jù)庫的默認(rèn)隔離級別。READ_UNCOMMITTED
:最低的隔離級別,允許臟讀。READ_COMMITTED
:允許不可重復(fù)讀,防止臟讀。REPEATABLE_READ
:允許幻讀,防止臟讀和不可重復(fù)讀。SERIALIZABLE
:最高的隔離級別,防止臟讀、不可重復(fù)讀和幻讀。
timeout
:事務(wù)超時時間,以秒為單位。默認(rèn)值是 -1,表示沒有超時限制。readOnly
:是否為只讀事務(wù)。默認(rèn)值是false
。只讀事務(wù)通常用于查詢操作,可以對某些數(shù)據(jù)庫優(yōu)化。rollbackFor
:指定哪些異常會導(dǎo)致事務(wù)回滾。例如:rollbackFor = RuntimeException.class
。noRollbackFor
:指定哪些異常不會導(dǎo)致事務(wù)回滾。例如:noRollbackFor = IllegalArgumentException.class
。
4. 事務(wù)傳播和隔離級別
事務(wù)傳播和隔離級別是 Spring 事務(wù)管理的重要概念。
- 事務(wù)傳播(Propagation):定義了事務(wù)方法被調(diào)用時事務(wù)的傳播行為。例如,當(dāng)前方法是否要在一個事務(wù)中運(yùn)行,是否要加入現(xiàn)有的事務(wù),或者是否要開啟一個新的事務(wù)。
- 隔離級別(Isolation):定義了一個事務(wù)可以看到其他事務(wù)對數(shù)據(jù)的影響程度。常見的隔離級別包括:
READ_UNCOMMITTED
、READ_COMMITTED
、REPEATABLE_READ
、SERIALIZABLE
。
示例:配置和使用事務(wù)
配置 Spring 事務(wù)管理
在 Spring Boot 中,只需要在主類或者配置類中添加 @EnableTransactionManagement
注解:
import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement public class AppConfig { // 配置數(shù)據(jù)源和事務(wù)管理器等 }
使用 @Transactional 注解
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { @Transactional public void createUser(User user) { // 創(chuàng)建用戶的業(yè)務(wù)邏輯 } }
總結(jié)
Spring 的事務(wù)管理機(jī)制通過編程式事務(wù)管理和聲明式事務(wù)管理兩種方式提供了靈活的事務(wù)控制。
聲明式事務(wù)管理是最常用的方式,通過 @Transactional
注解,可以方便地控制事務(wù)的傳播行為、隔離級別、超時時間和回滾規(guī)則。
Spring 事務(wù)管理機(jī)制的強(qiáng)大和靈活性,使得開發(fā)者可以輕松地處理復(fù)雜的事務(wù)場景,確保數(shù)據(jù)的一致性和完整性。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
idea2019版與maven3.6.2版本不兼容的解決方法
這篇文章主要介紹了idea2019版與maven3.6.2版本不兼容的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10springboot3.2整合mybatis-plus詳細(xì)代碼示例
這篇文章主要給大家介紹了關(guān)于springboot3.2整合mybatis-plus的相關(guān)資料,Spring Boot是一個非常流行的Java Web框架,可以快速地搭建Web應(yīng)用程序,需要的朋友可以參考下2023-12-12如何使用Spring?Boot設(shè)置上傳文件大小限制
上傳文件是互聯(lián)網(wǎng)中常應(yīng)用的場景之一,最典型的情況就是上傳頭像等,下面這篇文章主要給大家介紹了關(guān)于如何使用Spring?Boot設(shè)置上傳文件大小限制的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01