直接在service 層的方法上加上@Transactional 註解就ok。html
注意事項:java
一、Spring 基於註解的聲明式事物 @Transactional 默認狀況下只會對運行期異常(java.lang.RuntimeException及其子類)和 Error 進行回滾。spring
二、數據庫引擎要支持事物,使用InnoDB。數據庫
三、@Transactional 只能被應用到public方法上, 對於其它非public的方法,若是標記了@Transactional也不會報錯,但方法沒有事務功能.springboot
四、看到網上好多人說要在啓動類(配置類)上加 @EnableTransactionManagement 來開啓事務支持。oop
通過測試並不須要。測試
spring aop 異常捕獲原理:spa
被攔截的方法需顯式拋出異常,並不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,默認狀況下aop只捕獲 RuntimeException 的異常,但能夠經過配置來捕獲特定的異常並回滾 .net
換句話說在service的方法中不使用try catch 或者在catch中最後加上throw new runtimeexcetpion(),這樣程序異常時才能被aop捕獲進而回滾代理
想要不向上拋異常,也就是在service就捕獲異常,並且註解還生效的方法:
在service層方法的catch語句中增長:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常
要是你對於事物的基礎知識不太清楚,或想了解Spring使用事物的幾種方式能夠參考個人有道雲筆記:
參考:springBoot service 事務註解@Transactional不起做用的解決