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 容器拿代理对象调用;拆分到不同类。

事务相关配置

事务传播行为

相关推荐
Joy T3 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
AIgorithmGEEK5 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
m0_587383006 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·6 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停7 小时前
自动化测试(java)
java·开发语言·selenium·自动化
唠点键盘之外的8 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
云和恩墨8 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环
数据库
ly76898 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界
数据库·mongodb·事务·分片集群·快照隔离·写冲突
豆角焖肉8 小时前
Spring AOP 自定义注解实现系统操作日志
数据库·自定义注解·springaop·操作日志·aop 切面
鬼手点金9 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github