springboot 事务管理

在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 {

    @Bean
    public 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 {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
    }

    @Transactional
    public 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 {

    @Autowired
    private TransactionTemplate transactionTemplate;

    @Autowired
    private 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 {

    @Autowired
    private PlatformTransactionManager transactionManager;

    @Autowired
    private 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的事务管理非常强大且灵活,能够满足大多数应用场景的需求。

相关推荐
我命由我123451 分钟前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
key_3_feng16 分钟前
评估与对齐:Agent 自我进化的护栏
前端·数据库·agent
TangGeeA18 分钟前
数据库、SQL 与 DB AI
数据库·人工智能·sql
IvorySQL18 分钟前
开源数据库进校园| 11 月 3 日,IvorySQL 校园行走进浙大宁波校区:从 PostgreSQL 扩展生态到 AI 实战
数据库·postgresql·开源
福建佰胜张工33 分钟前
深度解析 Allen-Bradley 150-B135NBDA 智能电机控制器:选型、参数与工业应用
运维·数据库·单片机·嵌入式硬件·安全·自动化
`Levie38 分钟前
MySQL-数据库服务日志管理与数据闪回
数据库·mysql
香蕉大香蕉(06敬畏市场)41 分钟前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
LaughingZhu1 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
niucloud-admin1 小时前
NIUCLOUD PHP SAAS上门家政使用文档:服务保障
java·开发语言·php
standxy1 小时前
即时库存同步实战:从旺店通拉取库存详情落库 MySQL 的完整策略
数据库·集成·电商