事務是一組原子操作單元,要麼全部執行成功,要麼撤銷不執行。
一、事務概念
1.1 資料庫中的事物
資料庫事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性 (isolation)和永續性(durability)的縮寫。
事務的原子性:表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。
事務的一致性:表示當事務執行失敗時,所有被該事務影響的資料都應該恢復到事務執行前的狀態。
事務的隔離性:表示在事務執行過程中對資料的修改,在事務提交之前對其他事務不可見。
事務的永續性:表示已提交的資料在事務執行失敗時,資料的狀態都應該正確。
1.2 JAVA中的事物
一個Java應用系統,如果要運算元據庫,則透過JDBC來實現的。增加、修改、刪除都是透過相應方法間接來實現的,事務的控制也相應轉移到Java程式程式碼中。 因此,資料庫操作的事務 習慣上就稱為Java事務。
Spring事務管理分為程式設計式和宣告式:
- 程式設計式:透過編碼實現事務。
- 宣告式:基於AOP,將具體業務邏輯與事務處理解耦,使業務程式碼不受汙染。宣告式有兩種方式:一種是在配置檔案xml中做相關的事務規則宣告。另一種是基於@Transactional註解。
二、JAVA中事務使用
2.1 註解@Transactional(✅)
在SpringBoot中,在業務層新增事務註解(@Transactional )即可快速開啟事務,但是最小粒度只能用到方法上。
1、異常型別不正確
預設情況下,RuntimeException和Error的情況下,spring事務才會回滾,否則事務不會回滾。
也可以自定義回滾的異常型別:@Transactional(rollbackFor = {異常型別列表})
5、外部呼叫方法沒有事務
同一類中的兩個方法A和B,方法A沒有宣告註解事務,而B方法有,A呼叫本類的方法B(不論方法B是用public還是private修飾),方法B的事務是不會起作用的 原因。
解決:呼叫方法A上也新增註解。
注:不同類中呼叫不用加註解,是可以生效的。
參考資料
@Transactional註解配置事務管理(註解的使用)
一口氣說出 6種,@Transactional註解的失效場景 (失效場景)
Java中事務總結詳解
SpringBoot 快速開啟事務(附常見坑點)