Spring Framework之事務管理

問題

一、事務是什麼?html

二、事務的目的是什麼?spring

數據庫事務

​ Spring的事務管理底層基於數據庫事務,因此在學習Spring事務以前,咱們須要先學習數據庫事務。sql

事務的定義

​ 事務是數據庫管理系統執行過程當中的一個邏輯單位,由一個有限的數據庫操做序列構成。(來自維基百科)數據庫

​ 簡單翻譯就是將數據資源進行訪問的分步操做組合成一個總體操做,這一總體執行單元就是事務編程

事務的目的

​ 事務的目的是保證數據的一致性。併發

事務的特性

​ 要保證分步操做組合成一個總體操做時總體成功或總體失敗(同生共死)。就須要有嚴格的定義。ide

事務的4種特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔離性(IsoLation)、持久性(Durability)。post

  1. 原子性:同一事務的多個操做是不可分割的最小單元。當全部操做都執行成功時,才提交事務,不然撤銷全部操做成功的操做並恢復數據庫至初始狀態。
  2. 一致性:提交事務後,數據結果與業務預期規則保持一致。例如A向B轉帳不管事務是否提交成功,兩帳戶總額是不變的。
  3. 隔離性:併發操做時事務與事務間存在隔離,互不干擾,隔離性取決於數據庫的隔離級別。
  4. 持久性:事務提交成功後,事務中的一系列操做將持久化至數據庫中。

事務隔離級別

  1. 讀未提交:一個事務能夠讀取另外一個未提交的內容。可能會出現「髒讀」、「不可重複讀」、「幻讀」。
  2. 讀提交:一個事務只能讀取到另外一個數據已經提交成功的內容。可能會出現「不可重複讀」、「幻讀」。大部分數據庫的默認隔離級別
  3. 可重複讀:整個事務過程當中屢次對同一筆數據讀取結果相同。可能會出現「幻讀」。Mysql默認級別。
  4. 串行化:全部事務操做都必須按照順序依次執行。最嚴格的隔離級別。

數據併發問題

  1. 髒讀:事務1對數據進行更新,但未提交,但事務2可以讀取到未提交的內容。當事務對更新未提交的數據進行回滾時,事務2以前讀取到的。
  2. 不可重複讀:同一事務對同一數據屢次讀取,每次讀取結果不相同。事務1在事務2更新操做以前與以後分別讀取一次數據,就會出現兩個結果不一樣的狀況。
  3. 幻讀:同一事務對同一數據集合進行屢次的查詢,每次結果集不一樣。事務1在事務2插入或刪除操做先後分別讀取一次數據,其操做的結果集不相同。

出現髒讀的緣由:"select"操做沒有限制性能

出現不可重複讀的緣由:「update」操做沒有限制學習

出現幻讀的緣由:「insert」和「delete」操做沒有限制

事務隔離級別對數據併發問題的做用

  1. 讀未提交的做用:無做用。
  2. 讀提交:使用「快照讀」能避免「髒讀」,但不能避免「不可重複讀」、「幻讀」。
  3. 可重複讀:使用「快照讀」能避免「髒讀」、「不可重複讀」,但不能避免「幻讀」。
  4. 串行化:能避免「髒讀」、「不可重複讀」、「幻讀」。

快照讀

​ 快照讀基於MVCC和 undo log實現,適用於簡單的select語句。MVCC 併發版本控制,是靠 ReadView (事務視圖) 來實現的。

讀已提交:事務中每一條SQL都會生成一個ReadView。在執行查詢操做時都會讀取最新ReadView中的值。

可重複讀:事務開始時會生成一個ReadView。事務中的多條SQL都會讀取到同一個ReadView。在多條SQL查詢時也會讀取同一個ReadView中的值。

Spring事務管理

​ Spring爲事務管理提供統一的編程模板,在高層次創建統一的事務抽象。

事務管理接口

TransactionDefinition

​ 用於描述事務的隔離級別、超時時間、是否爲讀取事務以及事務的傳播規則等控制事務的具體屬性。

事務隔離級別

​ TransactionDefinition中定義了五個表示隔離級別的常量:

​ (1)TransactionDefinition.ISOLATION_DEFAULT,表示使用數據庫默認隔離界別(Oracle採用讀提交,Mysql默認採用可重複讀)

​ (2)TransactionDefinition.ISOLATION_READ_UNCOMMITTED,表示讀未提交。

​ (3)TransactionDefinition.ISOLATION_READ_COMMITTED,表示讀提交。

​ (4)TransactionDefinition.ISOLATION_REPEATABLE_READ,表示可重複讀。

​ (5)TransactionDefinition.ISOLATION_SERIALIZABLE,表示串行化。

事務傳播行爲

​ 當某個事務被另外一事務調用時,就須要指定事務傳播。

​ TransactionDefinition.PROPAGATION_REQUIRED,若是當前存在事務,則加入該事務;若是當前沒有事務,則建立一個新的事務,這是最多見的選擇。

​ TransactionDefinition.PROPAGATION_SUPPORTS, 若是當前存在事務,則加入該事務;若是當前沒有事務,則以非事務的方式繼續運行。

​ TransactionDefinition.PROPAGATION_MANDATORY,若是當前存在事務,則加入該事務;若是當前沒有事務,則拋出異常。

事務超時

​ 超過事務被容許運行的時間,事務在規定時間未完成將自動回滾事務。TransactionDefinition中以秒爲默認單位。

只讀狀態

​ 事務只對事務資源進行讀操做,不修改任何數據。若是隻對事務資源數據進行讀取操做,能夠設置爲只讀狀態,以提高運行性能。

回滾規則

​ 用於定義回滾與不會滾的對應異常。默認狀況下事務在運行期遇到特定異常時纔回滾。

TransactionStatus

​ 用於表示事務的具體運行狀態。事務管理器可以經過該接口獲取事務運行期的狀態信息,也能夠經過該接口間接地回滾事務,相比於在拋出異常時事務回滾更有意義。

PlatformTransactionManager

​ 事務管理器,提供事務提交、回滾以及根據事務定義信息從事務環境中返回一個已經存在的事務或建立一個新事務。

<!-- 事務管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 數據源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>

參考

[1]https://zh.wikipedia.org/wiki/數據庫事務

[2]https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc

[3]http://www.javashuo.com/article/p-ebdjhvai-da.html

[4]http://www.javashuo.com/article/p-ubezhkxh-cc.html

[5]《精通Spring4.x 企業應用開發實戰》

相關文章
相關標籤/搜索