赞
踩
在数据库操作中,事务(Transaction)是一个逻辑单元,由一组操作组成,这些操作要么全部成功,要么全部失败。事务具有以下四个特性,通常简称为 ACID 特性:
声明式事务管理是通过注解方式来管理事务,Spring Boot 支持使用 @Transactional
注解来声明事务。
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
-
- @Service
- public class UserService {
-
- private final UserRepository userRepository;
-
- public UserService(UserRepository userRepository) {
- this.userRepository = userRepository;
- }
-
- @Transactional
- public void updateUser(User user) {
- userRepository.save(user);
- }
- }
在上面的例子中,@Transactional
注解应用于 updateUser
方法,该方法中的所有数据库操作将作为一个事务进行。如果方法中的任何操作失败,整个事务将回滚。
传播行为(Propagation Behavior)定义了事务的边界和行为。Spring 提供了多个传播行为选项,常见的包括:
REQUIRED
(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新事务。REQUIRES_NEW
:总是创建一个新事务,如果当前存在事务,则将当前事务挂起。SUPPORTS
:如果当前存在事务,则加入该事务;如果没有事务,则以非事务方式执行。NOT_SUPPORTED
:总是以非事务方式执行,如果当前存在事务,则将当前事务挂起。MANDATORY
:如果当前存在事务,则加入该事务;如果没有事务,则抛出异常。NEVER
:总是以非事务方式执行,如果当前存在事务,则抛出异常。NESTED
:如果当前存在事务,则在当前事务中嵌套一个事务(仅支持 JDBC 事务管理器)。示例:
- @Transactional(propagation = Propagation.REQUIRES_NEW)
- public void createUser(User user) {
- userRepository.save(user);
- }
隔离级别(Isolation Level)控制事务操作之间的隔离程度,防止不同事务之间的干扰。常见的隔离级别包括:
DEFAULT
:使用数据库的默认隔离级别。READ_UNCOMMITTED
:允许读取未提交的数据,可能导致脏读。READ_COMMITTED
:只读取已提交的数据,防止脏读。REPEATABLE_READ
:确保在一个事务内多次读取数据时数据一致,防止不可重复读。SERIALIZABLE
:最高的隔离级别,完全隔离,防止脏读、不可重复读和幻读。- @Transactional(isolation = Isolation.SERIALIZABLE)
- public void updateUser(User user) {
- userRepository.save(user);
- }
你可以为事务设置超时时间和只读属性:
- @Transactional(timeout = 30, readOnly = true)
- public User findUserById(Long id) {
- return userRepository.findById(id).orElse(null);
- }
在上面的例子中,事务将设置为只读,并且超时时间为 30 秒。
除了声明式事务管理,Spring 还支持编程式事务管理,通常使用 TransactionTemplate
或 PlatformTransactionManager
进行控制。
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.TransactionStatus;
- import org.springframework.transaction.support.TransactionCallbackWithoutResult;
- import org.springframework.transaction.support.TransactionTemplate;
-
- @Service
- public class UserService {
-
- private final TransactionTemplate transactionTemplate;
- private final UserRepository userRepository;
-
- public UserService(TransactionTemplate transactionTemplate, UserRepository userRepository) {
- this.transactionTemplate = transactionTemplate;
- this.userRepository = userRepository;
- }
-
- public void updateUser(User user) {
- transactionTemplate.execute(new TransactionCallbackWithoutResult() {
- @Override
- protected void doInTransactionWithoutResult(TransactionStatus status) {
- userRepository.save(user);
- }
- });
- }
- }
- 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 {
-
- private final PlatformTransactionManager transactionManager;
- private final UserRepository userRepository;
-
- public UserService(PlatformTransactionManager transactionManager, UserRepository userRepository) {
- this.transactionManager = transactionManager;
- this.userRepository = userRepository;
- }
-
- public void updateUser(User user) {
- DefaultTransactionDefinition def = new DefaultTransactionDefinition();
- def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
-
- TransactionStatus status = transactionManager.getTransaction(def);
- try {
- userRepository.save(user);
- transactionManager.commit(status);
- } catch (Exception ex) {
- transactionManager.rollback(status);
- throw ex;
- }
- }
- }
在 Spring Boot 中,通常会自动配置 DataSourceTransactionManager
或 JpaTransactionManager
,具体取决于你使用的数据库和持久化框架。
如果需要自定义配置,可以在配置类中定义事务管理器:
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.transaction.PlatformTransactionManager;
- import org.springframework.transaction.annotation.EnableTransactionManagement;
- import org.springframework.transaction.support.TransactionTemplate;
-
- import javax.sql.DataSource;
-
- @Configuration
- @EnableTransactionManagement
- public class TransactionConfig {
-
- @Bean
- public PlatformTransactionManager transactionManager(DataSource dataSource) {
- return new DataSourceTransactionManager(dataSource);
- }
-
- @Bean
- public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
- return new TransactionTemplate(transactionManager);
- }
- }
通过 Spring Boot 的事务管理,可以有效地确保数据操作的一致性和完整性。声明式事务管理使用 @Transactional
注解,简单且易于使用。编程式事务管理提供了更细粒度的控制,但需要更多的代码。根据具体需求选择合适的事务管理方式,可以更好地保证应用程序的数据可靠性和性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。