【Spring】Spring的事務管理 - 1、Spring事務管理概述(數據庫事務、Spring事務管理的核心接口)

Spring事務管理概述

簡單記錄 - 簡單記錄-Java EE企業級應用開發教程(Spring+Spring MVC+MyBatis) 和 Spring 3.0就這麼簡單 -Spring的事務管理

Spring提供了靈活方便的事務管理功能,但這些功能都是基於底層數據庫本身的事務處理機制工作的。

要想深入瞭解Spring的事務管理和配置,就非常有必要先學習數據庫事務的基礎知識。

數據庫事務

那什麼是數據庫事務呢?

先了解下事務思想吧。

事務的思想:

很多複雜的事物要分步進行(複雜的東西經常拆分),但它們組成一個整體,要麼整體生效,要麼整體失效。這種思想反映到數據庫上,就是多個SQL語句,要麼所有執行成功,要麼所有執行失敗。

數據庫事務:

數據庫事務(Database Transaction)是指將一系列數據庫操作當作一個邏輯處理單元的操作,**這個單元中的數據庫操作要麼完全執行,要麼完全不執行。**通過將一組相關操作組合爲一個邏輯處理單元,可以簡化 錯誤恢復,並使應用程序更加可靠。

一個邏輯處理單元要成爲事務,必須滿足ACID屬性。(原子性Atomic、一致性Consistency、隔離性Isolation和持久性Durabiliy),所謂的ACID含義如下。

  • 原子性(Atomicity):表示組成一個事務的多個數據庫操作是一個不可分割的原子單元,只有所有的操作執行成功,整個事務才提交,事務中任何一個數據庫操作失敗,已經執行的任何操作都必須撤銷,讓數據庫返回到初始狀態。也就是一個事務內的操作,要麼全部執行成功,要麼全部執行不成功。
  • 一致性(Consistency):事務執行後,數據庫所處的狀態和它的業務規則是一致的,即數據不會被破壞。如轉賬業務,無論事務執行成功與否,參與轉賬的兩個賬號餘額之和應該是不變的(兩人的錢總額是不變的。)。
  • 隔離性(Isolation):在併發數據操作時,不同的事務擁有各自的數據空間,它們的操作不會對對方產生干擾。準確地說,並非要求做到完全無干擾,數據庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,**隔離級別越高,數據一致性越好,但併發性越弱。**每個事務獨立運行。在併發環境中,併發的事務是互相隔離的,互不影響。
  • 持久性(Durability):一旦事務提交成功後,事務中所有的數據操作都必須被持久化到數據庫中,即使提交事務後,數據庫馬上崩潰,在數據庫重啓時,也必須保證能夠通過某種機制恢復數據。也就是事務一旦提交後,數據庫中的數據必須被永久地保存下來。

在這些事務特性中,數據“一致性”是最終目標,其他的特性都是達到這個目標的措施、要求或手段。

數據庫管理系統一般採用重執行日誌保證原子性、一致性和持久性,重執行日誌記錄了數據庫變化的每一個動作,數據庫在一個事務中執行一部分操作後發生錯誤退出,數據庫即可以根據重執行日誌撤銷已經執行的操作。此外,對於已經提交的事務,即使數據庫崩潰,在重啓數據庫時也能夠根據日誌對尚未持久化的數據進行相應的重執行操作。

和Java程序採用對象鎖機制進行線程同步類似,數據庫管理系統採用數據庫鎖機制保證事務的隔離性。當多個事務試圖對相同的數據進行操作時,只有持有鎖的事務才能操作數據,直到前一個事務完成後,後面的事務纔有機會對數據進行操作。Oracle數據庫還使用了數據版本的機制,在回滾段爲數據的每個變化都保存一個版本,使數據的更改不影響數據的讀取。

什麼是Spring的事務管理?

那什麼是Spring的事務管理?

​ 在實際開發中,操作數據庫時都會涉及到事務管理問題,爲此Spring提供了專門用於事務處理的API。Spring的事務管理簡化了傳統的事務管理流程,並且在一定程度上減少了開發者的工作量。具體來說就是Spring提供的事務管理,使開發人員在做數據庫操作時,無須再手動執行對數據庫的提交或回滾操作,並且Spring還提供了對事務傳播的支持,可以實現更加複雜的事務嵌套的邏輯,對數據一致性提供了更好的支持。

Spring事務管理

Spring對事務管理的支持

Spring對事務管理的支持

Spring爲事務管理提供了一致的編程模板,在高層次建立了統一的事務抽象。也就是說,不管選擇Spring JDBC、Hibernate、JPA,還是MyBatis,Spring都讓用戶可以用統一的編程模型進行事務管理

像Spring DAO爲不同的持久化實現提供了模板類一樣,Spring事務管理繼承了這一風格,也提供了事務模板類TransactionTemplate。通過事務模板類TransactionTemplate並配合使用事務回調TransactionCallback指定具體的持久化操作就可以通過編程方式實現事務管理,而無須關注資源獲取、複用、釋放、事務同步和異常處理的操作。

Spring事務管理的亮點在於聲明式事務管理。Spring允許通過聲明方式,在IoC配置中指定事務的邊界和事務屬性,Spring自動在指定的事務邊界上應用事務屬性。聲明式事務是EJB赫一時的技術,Spring讓這種技術平民化,甚至可以說,Spring的聲明事務比EJB的更爲強大。

EJB事務建立在JTA的基礎上,而JTA又必須通過JNDI獲取,這意味着,不管用戶的應用是跨數據源的應用,還是單數據源的應用,EJB都要求使用全局事務的方式加以處理,這意味着基於EJB的應用無法脫離應用服務器所提供的容器環境。這種不加區分一概而論的做法無異於殺雞殺牛都用一把宰牛刀。

Spring深刻地認識到:大部分應用都基於單數據源,只有爲數不多的應用需要使用到多數據源的JTA事務。因此,在單數據源的情況下,Spring直接使用底層的數據源管理事務。在面對多數據源的應用時,Spring才尋求Java EE應用服務器的支持,通過引用應用服務器中的JNDI資源完成JTA事務。Spring讓人印象深刻的地方在於不管用戶使用何種持久化實現技術,也不管用戶是否使用了JTA事務,都可以採用相同事務管理模型。

這種統一的處理方式所帶來的好處是不可估量的:用戶完全可以拋開事務管理的問題編寫程序,並在Spring中通過配置完成事務的管理工作。

Spring事務管理的核心接口

在Spring的所有JAR包中,包含一個名爲spring-tx-5.2.3.RELEASE的JAR包,該包就是Spring提供的用於事務管理的依賴包。在該JAR包的org.springframework.transaction包中,有3個接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus

在這裏插入圖片描述

Spring事務管理的三個核心接口

1.PlatformTransactionManager

2.TransactionDefinition

3.TransactionStatus

TransactionDefinition用於描述事務的隔離級別、超時時間、是否爲只讀事務和事務傳播規則等控制事務具體行爲的事務屬性,這些事務屬性可以通過XML配置或註解描述提供,也可以通過手工編程的方式設置。PlatformTransactionManager根據TransactionDefinition提供的事務屬性配置信息,創建事務,並用TransactionStatus描述這個激活事務的狀態。下面分別介紹這些SPI(Service Provider Interface)接口內部的組成。

https://docs.spring.io/spring/docs/current/javadoc-api/

Platform TransactionManager

​ PlatformTransactionManager接口是Spring提供的平臺事務管理器,主要用於管理事務。該接口中提供了三個事務操作的方法,具體如下:

TransactionStatus getTransaction(TransactionDefinition definition);

該方法根據事務定義信息從事務環境中返回一個已存在的事務,或者創建一個新的事務,並用TransactionStatus描述這個事務的狀態。(用於獲取事務狀態信息)

void commit(TransactionStatus status);

根據事務的狀態提交事務,如果事務狀態已經被標識爲rollback-only,該方法將執行一個回滾事務的操作。(用於提交事務)

void rollback(TransactionStatus status);將事務回滾。當commit()方法拋出異常時,rollback()會被隱式調用。(用於回滾事務)

在上面的3個方法中,getTransaction(TransactionDefinition definition)方法會根據TransactionDefinition參數返回一個TransactionStatus對象,TransactionStatus對象就表示一個事務,它被關聯在當前執行的線程上。

​ PlatformTransactionManager接口只是代表事務管理的接口,並不知道底層是如何管理事務的,具體如何管理事務則由它的實現類來完成。該接口常見的幾個實現類如下:

常用接口實現類

org.springframework.jdbc.datasource.DataSourceTransactionManager

用於配置JDBC數據源的事務管理器

org.springframework.orm.hibernate4.HibernateTransactionManager

用於配置Hibernate的事務管理器

org.springframework.transaction.jta.JtaTransactionManager

用於配置全局事務管理器

提示:當底層採用不同的持久層技術時,系統只需使用不同的PlatformTransactionManager實現類即可。

TransactionDefinition

​ TransactionDefinition接口是事務定義(描述)的對象,該對象中定義了事務規則,並提供了獲取事務相關信息的方法,具體如下:

String getName( ); 獲取事務對象名稱

int getIsolationLevel( ); 獲取事務的隔離級別

int getPropagationBehavior( ); 獲取事務的傳播行爲

int getTimeout( ); 獲取事務的超時時間

boolean isReadOnly( ); 獲取事務是否只讀

​ 上述方法中,事務的傳播行爲是指在同一個方法中,不同操作前後所使用的事務。傳播行爲有很多種,具體如下表所示:

在這裏插入圖片描述

​ 在事務管理過程中,傳播行爲可以控制是否需要創建事務以及如何創建事務,通常情況下,數據的查詢不會影響原數據的改變,所以不需要進行事務管理,而對於數據的插入、更新和刪除操作,必須進行事務管理。如果沒有指定事務的傳播行爲,Spring默認傳播行爲是REQUIRED。

TransactionStatus

TransactionStatus接口是事務的狀態,它描述了某一時間點上事務的狀態信息。事務管理器通過該接口獲取事務運行期的狀態信息,也可以通過該接口間接地回滾事務,它相比於在拋出異常時回滾事務的方式更具可控性。該接口繼承於SavepointManager接口,SavepointManager接口基於JDBC 3.0保存點的分段事務控制能力提供了嵌套事務的機制。

該接口中包含6個方法,具體如下。

void flush(); 刷新事務

boolean hasSavepoint(); 獲取是否存在保存點

boolean isCompleted(); 獲取事務是否完成

boolean isNewTransaction(); 獲取是否爲新事務,如果返回false,表示當前事務是一個已經存在的事務,或者當前操作未運行在事務環境中。

boolean isRollbackOnly(); 獲取事務是否回滾

void setRollbackOnly(); 設置事務回滾,將當前的事務設置爲rollback-only。通過該標識通知事務管理器只能將事務回滾,事務管理器將通過顯式調用回滾命令或拋出異常的方式回滾事務。

事務管理的方式

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