背景
有兩個方法中,更新數部分是相同的,打算把這一部分那重來,做一個公用的私有方法。
考慮數據一致性,原本每個方法都使用了@Transactional(rollbackFor = Exception.class)注解,保證失敗回滾,創建私有方法以后,將@Transactional(rollbackFor = Exception.class)注解放到私有方法上,但private卻報錯,提示去掉private
查詢原因
@Transactional 注解用于對方法或類進行事務管理。同時,它只能應用在 public 修飾的方法上,而不能應用在 private 修飾的方法上。
原因是該注解是通過 Spring AOP 來實現事務管理的。Spring AOP 使用動態代理來實現方法攔截和增強,但是私有方法在子類中是不可見的,無法被子類覆蓋和繼承,因此無法生成代理對象來進行事務管理。
如果你想在私有方法上應用事務聲明,有以下幾種解決方案:
-
將私有方法改為 public 或受保護的方法:可以將私有方法改為 public 或受保護的方法,然后在這些方法上添加 @Transactional 注解,使其能夠被 Spring AOP 攔截并應用事務管理。這樣一來,在類的外部仍然無法直接調用私有方法,只能通過公共的方法來觸發私有方法的執行。
-
通過 self-invocation 來間接調用私有方法:如果你確實需要在私有方法中應用事務,你可以通過類內部的其他方法來間接調用私有方法,并在這些公共方法上添加 @Transactional 注解。這樣,事務將應用到間接調用的私有方法上。
需要注意的是,在使用 @Transactional 注解時,還需確保配置了事務管理器和正確的事務相關的配置,以便使事務生效。