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

事务相关配置

事务传播行为

相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解
java·jvm
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
DBA_G1 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库