01 事務

zhegeMaw發表於2024-08-15

事務是一組原子操作單元,要麼全部執行成功,要麼撤銷不執行

一、事務概念

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 )即可快速開啟事務,但是最小粒度只能用到方法上。

注意⚠️:MDP專案中,還需要在啟動類上新增增加@EnableTransactionManagement註解

使用註解:只能用在介面定義介面方法類定義類的public方法上,不能對程式碼塊進行事務控制。

2.1.1 事務失效的情況

1、異常型別不正確

預設情況下,RuntimeExceptionError的情況下,spring事務才會回滾,否則事務不會回滾。

也可以自定義回滾的異常型別:@Transactional(rollbackFor = {異常型別列表})

2、異常被捕獲
當業務方法丟擲異常,spring感知到異常的時候,才會做事務回滾的操作,若方法內部將異常給吃了,那麼事務無法感知到異常了,事務就不會回滾了。(不要捕獲異常)
3、非public方法
4、註解屬性 propagation 設定錯誤

5、外部呼叫方法沒有事務

同一類中的兩個方法A和B,方法A沒有宣告註解事務,而B方法有,A呼叫本類的方法B(不論方法B是用public還是private修飾),方法B的事務是不會起作用的 原因

解決:呼叫方法A上也新增註解。

注:不同類中呼叫不用加註解,是可以生效的。

參考資料

@Transactional註解配置事務管理(註解的使用)

一口氣說出 6種,@Transactional註解的失效場景 (失效場景)

Java中事務總結詳解

SpringBoot 快速開啟事務(附常見坑點)

相關文章