Spring事務總結

2021-10-17 20:17:18 字數 2351 閱讀 1605

參考:

事務傳播:

事務隔離:

spring的註解式事務,其底層原理是由aop實現的。

常用第一種。其餘根據各自的業務場景進行使用

假設外層事務 service a 的 method a() 呼叫 內層service b 的 method b()

如果serviceb.methodb() 的事務級別定義為 propagation_required,那麼執行 servicea.methoda() 的時候spring已經起了事務,這時呼叫 serviceb.methodb(),serviceb.methodb() 看到自己已經執行在 servicea.methoda() 的事務內部,就不再起新的事務。

假如 serviceb.methodb() 執行的時候發現自己沒有在事務中,他就會為自己分配乙個事務。

這樣,在 servicea.methoda() 或者在 serviceb.methodb() 內的任何地方出現異常,事務都會被回滾。

比如我們設計 servicea.methoda() 的事務級別為 propagation_required,serviceb.methodb() 的事務級別為 propagation_requires_new。

那麼當執行到 serviceb.methodb() 的時候,servicea.methoda() 所在的事務就會掛起,serviceb.methodb() 會起乙個新的事務,等待 serviceb.methodb() 的事務完成以後,它才繼續執行。

他與 propagation_required 的事務區別在於事務的回滾程度了。因為 serviceb.methodb() 是新起乙個事務,那麼就是存在兩個不同的事務。如果 serviceb.methodb() 已經提交,那麼 servicea.methoda() 失敗回滾,serviceb.methodb() 是不會回滾的。如果 serviceb.methodb() 失敗回滾,如果他丟擲的異常被 servicea.methoda() 捕獲,servicea.methoda() 事務仍然可能提交(主要看b丟擲的異常是不是a會回滾的異常)。

假設serviceb.methodb() 的事務級別為 propagation_supports,那麼當執行到serviceb.methodb()時,如果發現servicea.methoda()已經開啟了乙個事務,則加入當前的事務,如果發現servicea.methoda()沒有開啟事務,則自己也不開啟事務。這種時候,內部方法的事務性完全依賴於最外層的事務。

1、非publice方法不起作用

2、同乙個類內呼叫不起作用(classa.methorb() -->classa.)

現有比較成熟的解決方案是阿里的 seata 的at模式 事務,後續再做補充

原子性、隔離性、永續性、一致性

1、髒讀:乙個事務可以讀取另乙個未提交事務的資料。需要注意的是這裡針對的是資料本身,可以理解為針對單筆資料。

個人理解:事務a開啟進行了查詢資料,同時事務b開啟,修改了其中一筆資料,但並未提交,這時事務a又進行了查詢,這時就有兩筆不一樣的資料,然後事務b並沒有結束,事務b進行了事務回滾,這樣事務a就讀取了事務b修改後未提交的資料。因為這裡出現這種根本原因是未對資料進行提交,就進行了讀取。

需進行讀提交(read committed)就能解決。

2、不可重複讀:乙個事務進行讀取,分別讀取到了不同的資料。需要注意的是這裡針對的是資料本身,可以理解為針對單筆資料,重點是對資料的修改和刪除,所以對行加鎖就可以解決。

個人理解:事務a對資料進行查詢,這時事物b開啟,對其中一筆資料進行了修改,然後進行了提交(這裡進行了提交),然後事務a又對資料進行了查詢,發現同一筆不同了,所以事務a讀取了兩筆不同的資料,兩次讀取同筆資料有了不同的資料。出現這種根本原因是在事務a進行讀操作時,其他事務對資料進行了修改。

讀提交(read committed)是不足以解決的,需進行可重複讀(repeatable read)就能解決。

3、幻讀:乙個事務進行讀取,分別讀取到了不同的資料。需要注意的是這裡針對的是資料條數,可以理解為針對多筆資料是個資料集,重點是對資料的新增,所以對錶加鎖就可以解決。

個人理解:事務a對資料進行查詢,這時事物b開啟,對其中一筆資料進行了新增,然後進行了提交(這裡進行了提交),然後事務a又對資料進行了查詢,發現查詢所得的結果集是不一樣的。幻讀針對的是多筆記錄。讀提交(read committed)是不足以解決的,需進行serializable 序列化就能解決。

spring事務總結

1.spring中被標有 transactional註解 也就是事務 的方法不能夠自己呼叫自己。2.在同乙個service實現類中,不同的方法之間可以相互呼叫。3.spring框架的事務基礎架構 將預設地只在丟擲執行時和unchecked exceptions時才標識事務回滾。也就是說,當丟擲乙個 ...

spring 事務總結

tx是由aop實現的 aop的實現方式 1 方式 spring aop 1.jdk的基於介面方式 2.cglib的基於類的方式 修改位元組碼,加入extend 類?這兩種 方式 都存在父子關係,也跟日常生活中的 一樣。具體可以參考動態 模式 2 非 aspectj?這貨沒用 實現?有空看看cglib...

spring 事務總結

程式設計式事務 datasoucetransactionmanager 資料來源事務管理器 主要api 開啟事務,提交事務,回滾事務 宣告式事務 transaction 程式設計式事務封裝 aop動態 實現 常用屬性 rollbackfor 預設捕獲到error和runtimeexception 會...