java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot  @Transactional 事务

SpringBoot 中的 @Transactional 事务基本作用及注意事项示例详解

作者:喝汽水的猫^

@Transactional是SpringBoot中声明式事务管理的核心注解,通过注解简化事务控制,确保操作的原子性,支持异常回滚、隔离级别和传播行为配置,需注意代理模式、异常抛出及数据库支持等条件,避免事务失效,本文介绍SpringBoot @Transactional事务作用,感兴趣的朋友一起看看吧

前言

@Transactional 是 Spring 中用于声明式事务管理的核心注解,它可以简化事务控制逻辑,通过注解方式替代传统的编程式事务管理。在 Spring Boot 中,@Transactional 的使用尤为广泛,以下是其详细解析:

一、基本作用

@Transactional 用于标记某个方法或类需要被事务管理,Spring 会在方法执行前后自动开启、提交或回滚事务,确保操作的原子性(要么全成功,要么全失败)。

使用位置:

二、核心属性

@Transactional 有多个属性可配置,常用的包括:

属性名作用默认值
rollbackFor指定哪些异常触发回滚(类或数组)仅 RuntimeException 及其子类
noRollbackFor指定哪些异常不触发回滚
isolation事务隔离级别(控制并发数据可见性)Isolation.DEFAULT(数据库默认)
propagation事务传播行为(控制嵌套方法的事务归属)Propagation.REQUIRED
readOnly是否为只读事务(优化性能,适合查询操作)false
timeout事务超时时间(秒),超时后自动回滚-1(无超时)
value/transactionManager指定事务管理器(多数据源时使用)默认事务管理器

1. 异常回滚配置(rollbackFor/noRollbackFor)

示例:

@Transactional(rollbackFor = Exception.class) // 所有异常都回滚
public void saveData() throws Exception {
    // 业务逻辑
}

示例:

@Transactional(noRollbackFor = ArithmeticException.class)
public void process() {
    // 发生 ArithmeticException 不回滚,其他异常正常回滚
}

2. 隔离级别(isolation)

控制并发事务之间的数据可见性,可选值:

示例:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void queryData() {
    // 事务内查询,只能看到已提交的数据
}

3.脏读(Dirty Read)

定义:一个事务读取到了另一个未提交事务修改的数据。

场景示例:

危害:导致读取到临时且可能被撤销的数据,影响业务逻辑正确性。

避免方式:将事务隔离级别设置为 READ COMMITTED 或更高(REPEATABLE READ、SERIALIZABLE)。

MySQL 默认隔离级别是 REPEATABLE READ,已避免脏读。

4.幻读(Phantom Read)

定义:一个事务在两次查询中得到不同的结果集,因为另一个事务在两次查询之间插入或删除了数据。

场景示例:

5. 传播行为(propagation)

控制嵌套方法的事务归属,核心值:

示例:独立事务场景

@Service
public class OrderService {
    @Autowired
    private LogService logService;
    @Transactional(rollbackFor = Exception.class)
    public void createOrder() {
        // 订单业务(主事务)
        logService.saveLog(); // 调用日志服务
    }
}
@Service
public class LogService {
    // 日志保存使用独立事务,即使订单回滚,日志仍会提交
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void saveLog() {
        // 保存日志
    }
}

6. 其他属性

@Transactional(readOnly = true)
public List<User> queryUsers() {
    return userMapper.selectAll();
}
@Transactional(timeout = 10)
public void longTimeTask() {
    // 长时间任务,超时会回滚
}

三、事务生效条件

1.代理模式:Spring 事务基于 AOP 代理实现,需满足:

2.异常处理:

3.数据库支持:

四、常见问题

1.自调用事务失效:

@Service
public class UserService {
    public void methodA() {
        methodB(); // 自调用,事务可能失效
    }
    @Transactional
    public void methodB() {
        // 业务逻辑
    }
}

解决:通过 Spring 上下文获取代理对象调用,或使用 @EnableAspectJAutoProxy(exposeProxy = true) 暴露代理。

2.多线程事务不共享:

新线程中的方法不会加入当前事务,需手动协调事务。

3.错误的异常处理:

@Transactional
public void save() {
    try {
        // 业务逻辑
    } catch (Exception e) {
        // 异常被捕获,未抛出,事务不会回滚
    }
}

解决:捕获后需重新抛出异常,或手动调用 TransactionStatus.setRollbackOnly()。

五、总结

@Transactional 是 Spring Boot 中简化事务管理的强大工具,核心关注:

到此这篇关于SpringBoot 中的 @Transactional 事务详解及注意事项的文章就介绍到这了,更多相关SpringBoot @Transactional 事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文