Spring事務知識點分析

一、事物中的屬性

  1. 事務的四種特性(ACID)
  2. 事務的傳播行爲
  3. 事務的隔離級別
  4. 事務之間的缺陷

1、事務的四種特性(ACID)

  • 原子性:事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用。
  • 一致性:一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的數據不應該被破壞。
  • 隔離性:可能有許多事務會同時處理相同的數據,因此每個事務都應該與其他事務隔離開來,防止數據損壞。
  • 永久性:一旦事務完成,無論發生什麼系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化存儲器中。

2、事務的傳播行爲

  • PROPAGATION_REQUIRED: 表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。否則,會啓動一個新的事務。
  • PROPAGATION_SUPPORTS:。 表示當前方法不需要事務上下文,但是如果存在當前事務的話,那麼該方法會在這個事務中運行。
  • PROPAGATION_MANDATORY: 表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常。
  • PROPAGATION_REQUIRED_NEW: 表示當前方法必須運行在它自己的事務中。一個新的事務將被啓動。如果存在當前事務,在該方法執行期間,當前事務會被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager。
  • PROPAGATION_NOT_SUPPORTED: 表示該方法不應該運行在事務中。如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager。
  • PROPAGATION_NEVER: 表示當前方法不應該運行在事務上下文中。如果當前正有一個事務在運行,則會拋出異常
  • PROPAGATION_NESTED: 表示如果當前已經存在一個事務,那麼該方法將會在嵌套事務中運行。嵌套的事務可以獨立於當前事務進行單獨地提交或回滾。如果當前事務不存在,那麼其行爲與PROPAGATION_REQUIRED一樣。注意各廠商對這種傳播行爲的支持是有所差異的。可以參考資源管理器的文檔來確認它們是否支持嵌套事務。

3、事務的隔離級別

  • ISOLATION_DEFAULT: 使用後端數據庫默認的隔離級別.
  • ISOLATION_READ_UNCOMMITTED:(讀未提交) 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致髒讀、幻讀或不可重複讀.
  • ISOLATION_READ_COMMITTED:(讀已提交) 允許讀取併發事務已經提交的數據,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生.-----防止髒讀。
  • ISOLATION_REPEATABLE_READ:(可重複讀) 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生.-----防止髒讀和不可重複讀。
  • ISOLATION_SERIALIZABLE:(串行化) 最高的隔離級別,完全服從ACID的隔離級別,確保阻止髒讀、不可重複讀以及幻讀,也是最慢的事務隔離級別,因爲它通常是通過完全鎖定事務相關的數據庫表來實現的.----可以防止髒讀,不可重複讀和幻讀等問題。

4、事務之間的缺陷

 在事務處理中有違返ACID特性的3個問題:髒讀取,不可重複讀和幻讀行。如果存在多個併發事務在運行,而這種事務操作了同一個數據來完成它們的任務,就會導致3個問題的存生。要解決它們,就必須在事務之間定義合適的隔離級別。

  • 髒讀:當一個事務讀取了另一個事務未提交的數據,就是髒讀。
  • 不可重複讀:在一個事務中執行多次同樣的查詢操作,每次查詢的結果都不一樣,就叫做不可重複讀。通常這種情況是數據庫二次查詢期間被併發事務所修改了。
  • 幻讀:這是對事務危害最小的一種,類似於不可重複讀,當前事務更新結果會影響到另外一個事務,但它不僅會影響另外一個事務的查詢結果,還會使查詢語句返回一些不同的記錄。

二、spring事務管理器

  • DataSourceTransactionManager           JDBC事務管理器
  • HibernateTransactionManager            Hibernate事務管理器
  • JdoTransactionManager                  JDO事務管理器
  • JtaTransactionManager                   JTA事務管理器      
  • PersistenceBrokerTransactionManager    Apache的OJB事務管理器  

三、事務執行原理概述

自己的理解:

配置三步走:

第一步:在pom文件中加入我們spring-tx.jar的jar包

第二步在我們的執行的方法是加上@Transactional。

第三步需要在我們spring全局配置文件中引入我們的事務管理器。

第四步,在我們的全局配置文件類的頭部加上@EnableTransactionManagement註解來開啓我們的事務。

執行步驟:

第一步:入口在@EnableTransactionManagement這個開啓事務的註解裏面,跟蹤進去會發現註解對象裏面的頭部有一個導入的bean類對象(TransactionManagementConfigurationSelector.class):

進到這個類裏面看後,裏面定義都是事務的屬性配置,如:事務的隔離級別、事務的傳播行爲等。還有一個攔截器的方法,它是一個配置類,看下圖:

第二步:事務的屬性加載完後,會在spring中註冊一個事務的工廠bean,來創建一個對象,然後通過這個bean的後置處理器來,爲我們的業務方法對應類的目標對象生成一個代理類,通過代理來對目標對象方法做事務的處理。

跟蹤進去發現它是通過cglib的代理方式來爲目標對象來生成代理對象的,

然後利用cglib的動態代理的原理來進行操作,cglib動態代理裏面有個回調方法,那追蹤到這一步,我們事務就在這個回調函數做處理的。

回調函數裏面是怎麼做到什麼時候提交什麼時候回滾的呢?

查看源碼後發現他是利用異常處理類做的,代碼實例如下:

try{

//如果程序正常運行,這個地方就直接提交。

}catch(){

//出現異常就回滾

}finnaly(){

//這個地方做清除操作

}

 

 

資料:https://www.bilibili.com/video/BV1NE411h74p?from=search&seid=505787079179552104

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章