@Transactional注解

@Transactional注解
Transactional注解一、 核心工作原理二、 关键属性详解三、 常见失效场景与避坑指南四、 总结建议Transactional是 Spring 框架中实现声明式事务管理的核心注解。它通过 AOP面向切面编程动态代理机制将事务的开启、提交、回滚逻辑从业务代码中剥离极大简化了开发。一、 核心工作原理Spring 在运行时为标注了Transactional的 Bean 创建代理对象。方法调用前代理对象拦截请求根据配置获取或创建事务。方法执行中执行业务逻辑。方法结束后若无异常则提交事务若抛出指定异常则回滚事务。注意默认情况下Spring 仅对public方法生效且自调用类内部方法互调会导致事务失效因为绕过了代理对象。二、 关键属性详解propagation传播行为决定当前方法被另一个事务方法调用时事务如何传播。默认值为REQUIRED。传播行为含义场景示例REQUIRED如果当前存在事务则加入否则新建一个。大多数业务场景保证操作在同一事务中。REQUIRES_NEW无论当前是否有事务都新建一个独立事务。挂起当前事务。记录日志、审计信息即使主事务回滚日志也要保存。NESTED如果当前存在事务则在嵌套事务内执行保存点机制否则新建。部分成功部分失败的场景内部回滚不影响外部。SUPPORTS支持当前事务如果当前没有事务就以非事务方式执行。查询操作有事务就用没有也行。NOT_SUPPORTED以非事务方式执行如果当前存在事务则挂起当前事务。高性能非 DB 操作。MANDATORY使用当前的事务如果当前没有事务就抛出异常。强制要求必须在事务环境中运行。NEVER以非事务方式执行如果当前存在事务则抛出异常。严禁在事务中运行。isolation隔离级别指定事务的隔离级别解决并发问题。默认值为数据库默认级别如 MySQL 为READ_COMMITTED或REPEATABLE_READ取决于配置。DEFAULT使用底层数据库的默认隔离级别。READ_UNCOMMITTED读未提交。READ_COMMITTED读已提交。REPEATABLE_READ可重复读。SERIALIZABLE串行化。rollbackFor / noRollbackFor回滚规则决定哪些异常触发回滚。默认规则只有RuntimeException运行时异常和Error会触发回滚检查型异常Checked Exception如 IOException不会回滚。最佳实践通常设置rollbackFor Exception.class确保所有异常都回滚避免数据不一致。Transactional(rollbackForException.class)publicvoidupdateData(){...}timeout超时时间事务运行的最大秒数。超过该时间未提交自动回滚。防止长事务占用数据库连接资源。Transactional(timeout30)// 30秒超时readOnly只读优化提示数据库和 Hibernate 该事务只进行读取操作。作用Hibernate 可以跳过脏检查数据库可能优化查询计划。注意如果在只读事务中执行写操作通常会抛出异常。Transactional(readOnlytrue)publicListUserfindAll(){...}三、 常见失效场景与避坑指南自调用失效现象类 A 的方法 a() 调用同类的方法 b()b() 上有Transactional但事务不生效。原因Spring 事务基于代理自调用直接访问目标对象绕过了代理类的事务增强逻辑。解决注入自身 Bean 调用。使用AopContext.currentProxy()获取代理对象调用。将方法拆分到不同的 Service 类中。异常被吞没现象方法内部try-catch捕获了异常但未抛出事务不回滚。原因Spring 只有在异常抛出到代理层时才能感知并回滚。解决在 catch 块中手动抛出RuntimeException或调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()。方法非 public现象注解在private、protected或默认权限方法上。原因Spring 默认只对public方法创建事务代理。解决将方法改为public。数据库引擎不支持现象使用 MySQL MyISAM 引擎。原因MyISAM 不支持事务。解决确保表引擎为 InnoDB。四、 总结建议默认配置够用吗 对于大多数 CRUD 场景默认的REQUIRED传播行为和运行时异常回滚规则是足够的。何时需要自定义涉及多数据源或复杂事务嵌套时需仔细选择propagation。高并发查询场景添加readOnly true提升性能。关键业务数据更新务必设置rollbackFor Exception.class。分布式场景Transactional仅适用于单体应用或单数据库场景。微服务架构下需使用 Seata、TCC 或消息最终一致性方案。