首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【SpringBoot】Spring事务 @Transactional

【SpringBoot】Spring事务 @Transactional

原创
作者头像
lirendada
发布2026-08-15 12:13:31
发布2026-08-15 12:13:31
1200
举报
文章被收录于专栏:JavaJava

Spring中事务的实现

Spring中的事务操作分为两类:

  1. 编程式事务(手动实现事务)
  2. 声明式事务(利用注解自动开启事务)

一、编程式事务(了解)

Spring 手动操作事务和 MySQL 操作事务类似,有三个重要操作步骤:

  1. 开启事务(获取事务)
  2. 提交事务
  3. 回滚事务

SpringBoot 内置了两个对象:

  1. DataSourceTransactionManager:事务管理器,用来获取事务(开启事务),提交或回滚事务的
  2. TransactionDefinition:事务的属性,在获取事务的时候需要将 TransactionDefinition 传递进去从而获得一个事务 TransactionStatus

代码实现:

代码语言:javascript
复制
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user")
@RestController
public class UserController {
    // 注入事务管理器
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;
    
    // 注入事务属性
    @Autowired
    private TransactionDefinition transactionDefinition;
    
    @Autowired
    private UserService userService;
    
    @RequestMapping("/registry")
    public String registry(String name,String password){
        // 开启事务
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
        
        // 用户注册
        userService.registryUser(name,password);
        
        // 提交事务
        dataSourceTransactionManager.commit(transactionStatus);
        
        // 回滚事务
        //dataSourceTransactionManager.rollback(transactionStatus);
        return "注册成功";
    }
}

二、声明式事务:@Transactional

  1. 添加依赖
    代码语言:java
    复制
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
    </dependency>

2. 在需要事务的方法上添加 @Transactional 注解就可以实现了。无需手动开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果中途发生了没有处理的异常会自动回滚事务

代码语言:javascript
复制
@RequestMapping("/trans")
@RestController
public class TransactionalController {
    @Autowired
    private UserService userService;
    
    @Transactional
    @RequestMapping("/registry")
    public String registry(String name,String password){
        // 用户注册
        userService.registryUser(name,password);
        return "注册成功";
    }
}

@Transactional 的作用

  • 修饰 方法只有修饰 public 方法时才生效(修饰其他方法时不会报错,也不生效)[推荐]
  • 修饰 :对 @Transactional 修饰的类中所有的 public 方法都生效。

💥注意事项:

  • 如果在方法执行过程中,出现异常,且异常未被捕获,就进行事务回滚操作。
  • 如果异常被程序捕获,方法就被认为是成功执行,依然会提交事务。

下面对异常进行捕获:

代码语言:javascript
复制
@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){
    userService.registryUser(name,password); // 模拟用户注册功能
    log.info("用户数据插入成功");
    
    // 对异常进行捕获
    try {
        // 强制程序抛出异常
        int a = 10/0;
    }catch (Exception e){
        e.printStackTrace();
    }
    return "注册成功";
}

运行程序,发现虽然程序出错了,但是由于异常被捕获了所以事务依然得到了提交

如果需要事务进行回滚,有以下两种方式:

  1. 重新抛出异常
    代码语言:javascript
    复制
    @Transactional
    @RequestMapping("/registry")
    public String registry(String name,String password){
        userService.registryUser(name,password);
        log.info("用户数据插入成功");
        // 对异常进行捕获
        try {
            int a = 10/0;
        }catch (Exception e){
            // 将异常重新抛出去
            throw e;
        }
        return "注册成功";
    }

2. 手动回滚事务:使用 TransactionAspectSupport.currentTransactionStatus() 得到当前的事务,并使用 setRollbackOnly 设置回滚。

代码语言:java
复制
@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){
    userService.registryUser(name,password);
    log.info("用户数据插入成功");
    // 对异常进行捕获
    try {
        int a = 10/0;
    }catch (Exception e){
        // 手动回滚事务
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
    return "注册成功";
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • Spring中事务的实现
    • 一、编程式事务(了解)
    • 二、声明式事务:@Transactional
      • @Transactional 的作用
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档