2 回答

TA貢獻1868條經驗 獲得超4個贊
這是因為您正在@Transactional從同一個 bean 中調用方法。
@Transactional僅適用于在 spring 創建的代理上調用的方法。這意味著,當您創建一個@Service或其他 bean 時,從外部調用的方法將是事務性的。如果從 bean 中調用,什么都不會發生,因為它不通過代理對象。
最簡單的解決方案是將方法移至另一個@Service或 bean。如果你真的想將它保存在同一個組件中,那么你需要調用它,以便它被 spring AOP 包裝在代理中。你可以這樣做:
private YourClass self;
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void postContruct(){
self = applicationContext.getBean(YourClass.class);
}
然后調用方法self將導致打開事務。

TA貢獻1827條經驗 獲得超8個贊
標記非公共方法 @Transactional 既無用又具有誤導性,因為 Spring 沒有“看到”非公共方法,因此沒有為它們的正確調用做準備。Spring 也沒有為它調用的方法調用的方法做準備。
因此,標記私有方法,例如,@Transactional 只有在方法實際上被寫入@Transactional 時才會導致運行時錯誤或異常。
添加回答
舉報