@Transactional注解使用及事务失效场景详解

@Transactional注解使用及事务失效场景详解

一、@Transactional基础使用

作用范围‌:

可作用于接口、类及public方法上

类级别注解会应用到所有public方法‌

方法级别注解会覆盖类级别配置‌

核心属性配置‌:

java

Copy Code

@Transactional(

isolation = Isolation.DEFAULT, // 隔离级别

propagation = Propagation.REQUIRED, // 传播行为

timeout = 30, // 超时时间(秒)

rollbackFor = Exception.class // 回滚异常类型

)

@Transactional注解使用及事务失效场景详解

二、事务失效的典型场景

1. 方法访问权限问题

非public方法‌:注解在private/protected方法上时事务不生效‌

final/static方法‌:AOP代理无法增强这些方法‌

2. 自调用问题

java

Copy Code

public class OrderService {

public void createOrder() {

this.updateStock(); // 自调用导致事务失效

}

@Transactional

public void updateStock() {

// 库存操作

}

}

解决方法:通过AopContext.currentProxy()或注入自身bean‌

3. 异常处理不当

捕获异常未抛出‌:try-catch吞没异常导致无法触发回滚‌

rollbackFor配置错误‌:默认只回滚RuntimeException和Error‌

错误示例‌:

java

Copy Code

@Transactional

public void process() {

try {

// 业务代码

} catch (Exception e) {

log.error(“错误”, e); // 未抛出异常

}

}

4. 传播行为配置问题

嵌套事务冲突‌:内层事务标记rollback-only导致外层提交失败‌

REQUIRES_NEW使用不当‌:新事务失败不影响原事务‌

5. 数据库引擎不支持

MyISAM引擎不支持事务,需使用InnoDB‌

6. 多数据源配置问题

未指定事务管理器或指定错误‌

三、最佳实践提议

准确控制事务范围‌:

避免类级别滥用,按需使用方法级别注解‌

只对需要事务的写操作添加注解‌

明确异常配置‌:

java

Copy Code

@Transactional(rollbackFor = Exception.class)

超时设置‌:

java

Copy Code

@Transactional(timeout = 30)

调试技巧‌:

开启事务日志:
logging.level.org.springframework.transaction=DEBUG

检查代理对象:System.out.println(this.getClass())‌

特别注意:在MyBatis-Plus中使用时,批量操作需结合@Transactional确保原子性,但要注意嵌套事务问题‌

@Transactional注解使用及事务失效场景详解

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共1条

请登录后发表评论

    暂无评论内容