Spring事務原理分析-部分一

Spring事務原理分析-部分一

什麼事務

事務:邏輯上的一組操做,組成這組操做的各個單元,要麼全都成功,要麼全都失敗。數據庫

事務基本特性

⑴ 原子性(Atomicity)

  原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾,所以事務的操做若是成功就必需要徹底應用到數據庫,若是操做失敗則不能對數據庫有任何影響。編程

⑵ 一致性(Consistency)

 一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態。安全

  拿轉帳來講,假設用戶A和用戶B二者的錢加起來一共是5000,那麼無論A和B之間如何轉帳,轉幾回帳,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。併發

⑶ 隔離性(Isolation)

  隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。orm

  即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始以前就已經結束,要麼在T1結束以後纔開始,這樣每一個事務都感受不到有其餘事務在併發地執行。對象

  關於事務的隔離性數據庫提供了多種隔離級別,稍後會介紹到。接口

⑷ 持久性(Durability)

持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。事務

例如咱們在使用JDBC操做數據庫時,在提交事務方法後,提示用戶事務操做完成,當咱們程序執行完成直到看到提示後,就能夠認定事務以及正確提交,即便這時候數據庫出現了問題,也必需要將咱們的事務徹底執行完成,不然就會形成咱們看到提示事務處理完畢,可是數據庫由於故障而沒有執行事務的重大錯誤。ci

若是不考慮隔離性引起安全性問題

讀問題
  • 髒讀 :一個事務讀到另外一個事務未提交的數據
  • 不可重複讀 :一個事務讀到另外一個事務已經提交的update的數據,致使一個事務中屢次查詢結果不一致
  • 虛讀、幻讀 :一個事務讀到另外一個事務已經提交的insert的數據,致使一個事務中屢次查詢結果不一致。
寫問題
  • 丟失更新
解決讀問題
  • 設置事務的隔離級別開發

  • Read uncommitted :未提交讀,任何讀問題解決不了。

  • Read committed :已提交讀,解決髒讀,可是不可重複讀和虛讀有可能發生。

  • Repeatable read :重複讀,解決髒讀和不可重複讀,可是虛讀有可能發生。

  • Serializable :解決全部讀問題。

Spring的事務管理的API

PlatformTransactionManager:平臺事務管理器

  • 平臺事務管理器:接口,是Spring用於管理事務的真正的對象。

  • DataSourceTransactionManager :底層使用JDBC管理事務

  • HibernateTransactionManager :底層使用Hibernate管理事務

TransactionDefinition :事務定義信息

  • 事務定義:用於定義事務的相關的信息,隔離級別、超時信息、傳播行爲、是否只讀

TransactionStatus:事務的狀態

  • 事務狀態:用於記錄在事務管理過程當中,事務的狀態的對象。

事務管理的API的關係:

Spring進行事務管理的時候,首先平臺事務管理器根據事務定義信息進行事務的管理,在事務管理過程當中,產生各類狀態,將這些狀態的信息記錄到事務狀態的對象中。

Spring的事務的傳播行爲

Spring的傳播行爲

  • Spring中提供了七種事務的傳播行爲:

  • 保證多個操做在同一個事務中

  • PROPAGATION_REQUIRED :默認值,若是A中有事務,使用A中的事務,若是A沒有,建立一個新的事務,將操做包含進來

  • PROPAGATION_SUPPORTS :支持事務,若是A中有事務,使用A中的事務。若是A沒有事務,不使用事務。

  • PROPAGATION_MANDATORY :若是A中有事務,使用A中的事務。若是A沒有事務,拋出異常。

保證多個操做不在同一個事務中

  • PROPAGATION_REQUIRES_NEW :若是A中有事務,將A的事務掛起(暫停),建立新事務,只包含自身操做。若是A中沒有事務,建立一個新事務,包含自身操做。

  • PROPAGATION_NOT_SUPPORTED :若是A中有事務,將A的事務掛起。不使用事務管理。

  • PROPAGATION_NEVER :若是A中有事務,報異常。

  • 嵌套式事務

  • PROPAGATION_NESTED :嵌套事務,若是A中有事務,按照A的事務執行,執行完成後,設置一個保存點,執行B中的操做,若是沒有異常,執行經過,若是有異常,能夠選擇回滾到最初始位置,也能夠回滾到保存點。

事務控制分類

編程式事務控制

​ 本身手動控制事務,就叫作編程式事務控制。

​ Jdbc代碼:

​ Conn.setAutoCommite(false); // 設置手動控制事務

​ Hibernate代碼:

​ Session.beginTransaction(); // 開啓一個事務

​ 【細粒度的事務控制: 能夠對指定的方法、指定的方法的某幾行添加事務控制】

​ (比較靈活,但開發起來比較繁瑣: 每次都要開啓、提交、回滾.)

聲明式事務控制

​ Spring提供了對事務的管理, 這個就叫聲明式事務管理。

​ Spring提供了對事務控制的實現。用戶若是想用Spring的聲明式事務管理,只須要在配置文件中配置便可; 不想使用時直接移除配置。這個實現了對事務控制的最大程度的解耦。

​ Spring聲明式事務管理,核心實現就是基於Aop。

​ 【粗粒度的事務控制: 只能給整個方法應用事務,不能夠對方法的某幾行應用事務。】

​ (由於aop攔截的是方法。)

​ Spring聲明式事務管理器類:

​ Jdbc技術:DataSourceTransactionManager

​ Hibernate

技術:HibernateTransactionManager

相關文章
相關標籤/搜索