① 看注解
方法/類上有
@Transactional
→ 需要事務,必須走代理方法/類上有自定義 AOP 注解(如
@Log
、@Retry
、@Cacheable
等)→ 需要代理什么都沒有 → 幾乎肯定不需要
示例 | 需求 |
---|---|
@Transactional public void generateDailyTask(...) | ? 需要事務 |
public void getInfo(...) | ? 不需要 |
② 看業務動作
寫庫、更新、刪除 或 跨表多條操作 → 大概率要事務
純查詢、拼裝 VO、遠程調用只讀接口 → 基本不需要
③ 看調用鏈
如果 外部已經通過 Spring 代理調用(Controller/Service/Job 里的公共方法),
再在這個方法內部調用 同類的私有/受保護方法 → 不再走代理,事務/AOP 失效因此 內部再調需要事務的方法 → 必須重新拿代理
如果是方法自己調自己會跳過代理,需要重新拿bean再調用才能讓事務/AOP生效。?