① 看注解
方法/类上有
@Transactional
→ 需要事务,必须走代理方法/类上有自定义 AOP 注解(如
@Log
、@Retry
、@Cacheable
等)→ 需要代理什么都没有 → 几乎肯定不需要
示例 | 需求 |
---|---|
@Transactional public void generateDailyTask(...) | ✅ 需要事务 |
public void getInfo(...) | ❌ 不需要 |
② 看业务动作
写库、更新、删除 或 跨表多条操作 → 大概率要事务
纯查询、拼装 VO、远程调用只读接口 → 基本不需要
③ 看调用链
如果 外部已经通过 Spring 代理调用(Controller/Service/Job 里的公共方法),
再在这个方法内部调用 同类的私有/受保护方法 → 不再走代理,事务/AOP 失效因此 内部再调需要事务的方法 → 必须重新拿代理
如果是方法自己调自己会跳过代理,需要重新拿bean再调用才能让事务/AOP生效。