一般我們在開發時,在方法或者類上加了@transactional事務註解,然後會用 try catch 將可能會出問題的**塊包起來,在catch裡面處理捕獲的異常,但是,如果在catch裡面沒有把異常丟擲去,此時事務是不會自動回滾的
比如這種情況:
這裡既沒有丟擲異常,也沒有手動回滾,在插入流水表之後,模擬報錯,下面更新總支出和總繳存不會執行,但上面的流水已經插入了,看結果
這種情況顯然不可取
在catch裡面將手動回滾**加上
//手動回滾
transactionaspectsupport.
currenttransactionstatus()
.setrollbackonly()
;
效果:
可見資料庫並沒有remark為:測試手動回滾 的流水資料,說明回滾生效
將手動回滾注釋,加上丟擲異常
這裡可以看到,新的測試自動回滾的流水也沒有插入到流水表,丟擲異常後已自動回滾
在日常開發中,如果我們將多條運算元據庫的**用try catch 包起來後,在前面運算元據庫**執行成功,後面運算元據庫**執行失敗的情況下,不會滾資料會出問題,常用的解決的方法就是
//手動回滾
transactionaspectsupport.
currenttransactionstatus()
.setrollbackonly()
;
知識點:spring aop 異常捕獲原理:被攔截的方法需顯式丟擲異常,並不能經任何處理,這樣aop**才能捕獲到方法的異常,才能進行回滾,預設情況下aop只捕獲runtimeexception的異常,或通過配置來捕獲特定的異常並回滾。 springboot事務手動回滾
專案中的事務,我們一般都是使用註解式事務,在service層加上 transactional,或者加在具體方法上。但有的時候我們需要手動回滾事務,如以下兩種情況 1 try.catch到異常之後需要回滾事務。如阿里巴巴開發手冊中就提到 強制 有 try 塊放到了事務 中,catch 異常後,如果需要...
spring手動回滾事務
1.在開發中通過 transaction註解進行事務控制,如果當前方法丟擲異常則自動回滾事務 transactional public void addbook book book 2.如果方法中人為捕獲了異常並且沒有丟擲異常則spring不會自動回滾 transactional public vo...
SpringBoot手動新增事務回滾
org.springframework.boot spring boot starter jdbc 新增依賴成功後,事務就預設開啟了,只需要在需要的方法和類上新增註解 transactional上就可以 注意 當新增在類上,說明此類的public的方法都行事務管理 transactionaspect...