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

