spring-事务@Transactional

Spring事务作用

在数据层或业务层保障一系列的数据库操作同成功同失败。

@Transactional是什么

@Transactional是 Spring 提供的声明式事务注解,本质上通过 AOP 代理 + 事务管理器,在业务方法执行前开启事务,执行成功后提交,发生符合回滚规则的异常时回滚。

事务失效

|-------------|-----------------------------------|-----------------------------------------------------|
| 失效场景 | 原因 | 解决方案 |
| 方法不是 public | Spring AOP 代理默认只对 public 方法生效。 | 确保事务方法是 public 的。 |
| 同类中的自调用 | 通过 this 调用绕过了代理对象。 | 将事务方法移至另一个 Bean 中;或通过 AopContext.currentProxy() 调用。 |
| 异常被"吞掉" | 方法内 catch 了异常但没有抛出,事务管理器认为执行成功。 | 在 catch 块中重新抛出异常,或手动回滚。 |
| 异常类型不匹配 | 默认只对 RuntimeException 和 Error 回滚。 | 使用 rollbackFor = Exception.class 明确指定。 |
| 数据库不支持事务 | 如使用 MyISAM 引擎的 MySQL 表。 | 使用支持事务的存储引擎(如 InnoDB)。 |

同类内部调用

复制代码
@Service

public class OrderService {

    public void test() {

        createOrder(); // this.createOrder(),调用原始对象,不走代理,事务失效

    }

    @Transactional

    public void createOrder(){}

}

解决:从 IOC 容器拿代理对象调用;拆分到不同类。

事务相关配置

事务传播行为

相关推荐
code2cat12 小时前
Java工具篇之Maven:从pom.xml到测试通过的JAR
xml·java·maven
wuminyu19 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
txxzjmzlh19 小时前
SpringBoot 配置⽂件
java·spring boot·spring
ss27319 小时前
PostgreSQL常见索引问题与解决方案
数据库·postgresql
小徐不徐说19 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
Wang's Blog19 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象32720 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
独泪了无痕20 小时前
Hutool之LocalDateTimeUtil:让时间间隔操作如虎添翼
java
瀚高PG实验室21 小时前
发布端逻辑复制槽消失
数据库·postgresql·瀚高数据库
ss27321 小时前
PostgreSQL慢查询定位与优化
数据库·postgresql