在Spring Boot中,事務管理是通過Spring框架的事務管理模塊來實現的。Spring提供了聲明式事務管理和編程式事務管理兩種方式。通常,我們使用聲明式事務管理,因為它更簡潔且易于維護。
1. 聲明式事務管理
聲明式事務管理是通過注解來實現的。Spring Boot中使用@Transactional
注解來標記需要事務管理的方法或類。
1.1 配置事務管理器
Spring Boot默認使用DataSourceTransactionManager
來管理事務。如果你使用的是Spring Boot的自動配置,通常不需要手動配置事務管理器。但如果你有特殊需求,可以手動配置:
java
復制
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;@Configuration @EnableTransactionManagement public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);} }
1.2 使用@Transactional
注解
你可以在方法或類上使用@Transactional
注解來聲明事務。當方法被調用時,Spring會自動開啟事務,并在方法執行完成后提交事務。如果方法拋出異常,事務會回滾。
java
復制
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;@Service public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void createUser(User user) {userRepository.save(user);}@Transactionalpublic void updateUser(User user) {userRepository.save(user);}@Transactional(readOnly = true)public User getUserById(Long id) {return userRepository.findById(id).orElse(null);} }
1.3 事務傳播行為
@Transactional
注解還支持配置事務的傳播行為。例如:
java
復制
@Transactional(propagation = Propagation.REQUIRED) public void someMethod() {// 業務邏輯 }
常見的傳播行為包括:
-
REQUIRED
:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。 -
REQUIRES_NEW
:創建一個新的事務,如果當前存在事務,則掛起當前事務。 -
SUPPORTS
:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務方式執行。 -
NOT_SUPPORTED
:以非事務方式執行操作,如果當前存在事務,則掛起當前事務。 -
MANDATORY
:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。 -
NEVER
:以非事務方式執行,如果當前存在事務,則拋出異常。 -
NESTED
:如果當前存在事務,則在嵌套事務內執行;如果當前沒有事務,則創建一個新的事務。
1.4 事務隔離級別
@Transactional
注解還支持配置事務的隔離級別。例如:
java
復制
@Transactional(isolation = Isolation.READ_COMMITTED) public void someMethod() {// 業務邏輯 }
常見的隔離級別包括:
-
DEFAULT
:使用底層數據庫的默認隔離級別。 -
READ_UNCOMMITTED
:允許讀取未提交的數據變更。 -
READ_COMMITTED
:只能讀取已提交的數據變更。 -
REPEATABLE_READ
:確保在同一事務中多次讀取同一數據時,結果一致。 -
SERIALIZABLE
:最高的隔離級別,確保事務串行執行。
1.5 事務回滾規則
默認情況下,@Transactional
注解會在遇到RuntimeException
及其子類時回滾事務。你可以通過rollbackFor
和noRollbackFor
屬性來指定回滾的異常類型。
java
復制
@Transactional(rollbackFor = Exception.class) public void someMethod() throws Exception {// 業務邏輯 }
2. 編程式事務管理
編程式事務管理是通過編寫代碼來手動管理事務的。雖然這種方式更靈活,但代碼會顯得更復雜。
2.1 使用TransactionTemplate
TransactionTemplate
是Spring提供的一個工具類,用于簡化編程式事務管理。
java
復制
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.support.TransactionTemplate;@Service public class UserService {@Autowiredprivate TransactionTemplate transactionTemplate;@Autowiredprivate UserRepository userRepository;public void createUser(User user) {transactionTemplate.execute(status -> {userRepository.save(user);return null;});} }
2.2 使用PlatformTransactionManager
你也可以直接使用PlatformTransactionManager
來手動管理事務。
java
復制
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition;@Service public class UserService {@Autowiredprivate PlatformTransactionManager transactionManager;@Autowiredprivate UserRepository userRepository;public void createUser(User user) {TransactionDefinition definition = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(definition);try {userRepository.save(user);transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);throw e;}} }
3. 總結
-
聲明式事務管理:通過
@Transactional
注解實現,推薦使用。 -
編程式事務管理:通過
TransactionTemplate
或PlatformTransactionManager
實現,適用于復雜場景。
Spring Boot的事務管理非常強大且靈活,能夠滿足大多數應用場景的需求。