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

事务相关配置

事务传播行为

相关推荐
数智启示录17 分钟前
Apache Doris 4.0.8 数据建模实战(第 2 篇):同一批订单写进三种模型,为什么得到三个答案
大数据·数据库·面试
数智启示录26 分钟前
Apache Doris 4.0.8 CDC 正确性(第 9 篇):Flink Checkpoint 一直成功,表里为什么仍是旧数据
大数据·数据库·经验分享·面试·flink
万年咸鱼28 分钟前
Java List 接口详解:从基础到实战
java·windows·list
Java的搬运工31 分钟前
Spring boot 事件监听
java·spring boot·spring·编程语言
tryxr35 分钟前
Chat2Excel 项目网关服务开发
java·gateway·网关模块开发
谢亮_vipxieliang35 分钟前
ValidX vs Apache Commons Validator:功能与性能对比
java·服务器·spring boot·后端·spring cloud·apache·hibernate
tryxr40 分钟前
Chat2Excel 项目通用服务开发
java·开发语言·excel·java项目开发
小裕哥略帅44 分钟前
Spring AOP 实现通用 Token 自动刷新重试工具包
java·后端·spring
凤山老林1 小时前
Spring Boot 3 + Spring Authorization Server 构建企业级 SSO:多端互通、会话共享与
spring boot·后端·spring·单点登录·sso·多端互通