
一、@Transactional基础使用
作用范围:
可作用于接口、类及public方法上
类级别注解会应用到所有public方法
方法级别注解会覆盖类级别配置
核心属性配置:
java
Copy Code
@Transactional(
isolation = Isolation.DEFAULT, // 隔离级别
propagation = Propagation.REQUIRED, // 传播行为
timeout = 30, // 超时时间(秒)
rollbackFor = Exception.class // 回滚异常类型
)

二、事务失效的典型场景
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确保原子性,但要注意嵌套事务问题






















暂无评论内容