摘要
本文摘抄了Spring事務相關的一些理論,主要講述事務的特性、事務的傳播行為、事務的隔離規(guī)則。
從網站建設到定制行業(yè)解決方案,為提供成都網站設計、成都做網站服務體系,各種行業(yè)企業(yè)客戶提供網站建設解決方案,助力業(yè)務快速發(fā)展。創(chuàng)新互聯(lián)建站將不斷加快創(chuàng)新步伐,提供優(yōu)質的建站服務。
關鍵詞:事務特性,事務傳播,事務隔離
一、什么是事務
事務是用來保證數(shù)據的完整性和一致性,正如金錢轉賬,金錢總數(shù)不會增加也不會減少。
數(shù)據庫 事務管理有四個特性(ACID):
特性描述原子性(Atomicity)事務作為一個整體被執(zhí)行,要么全部被執(zhí)行,要么都不執(zhí)行。一致性(Consistency)事務應確保數(shù)據的狀態(tài)從一個一致狀態(tài)轉變?yōu)榱硪粋€一致狀態(tài),數(shù)據不應該被破壞。隔離性(Isolation)多個事務并發(fā)執(zhí)行時,一個事務的執(zhí)行不應影響其他事務的執(zhí)行。持久性(Durability)已被提交的事務對數(shù)據的修改應該永久性的。
二、Spring事務管理器
Spring中定義了事務管理的總接口PlatformTransactionManager,該接口定義了以下幾個接口來管理事務:
getTransaction() - 獲取事務狀態(tài)(TransactionStatus),該事務由(TransactionDefinition定義)
commit() - 提交事務
rollback() - 回滾事務
Spring不直接管理事務,而是提供一個事務管理接口,由其他平臺(如JDBC、Hibernate)自己實現(xiàn)事務管理。
幾個具體的事務:
事務名稱管理器類說明JDBC事務org.springframework.jdbc.datasource.DataSourceTransactionManager通過調用java.sql.Connection來管理事務Hibernateorg.springframework.orm.hibernate3.HibernateTransactionManager事務管理由org.hibernate.Transaction對象負責Java持久化API事務(JPA)org.springframework.orm.jpa.JpaTransactionManagerJpaTransactionManager與由工廠(javax.persistence.EntityManagerFactory)所產生的JPA EntityManager合作來構建事務Java原生API事務org.springframework.transaction.jta.JtaTransactionManagerJtaTransactionManager將事務管理的責任委托給javax.transaction.UserTransaction和javax.transaction.TransactionManager對象(允許在多個數(shù)據庫之間管理多個事務)
關于JTA,參考Java中的事務——JDBC事務和JTA事務
小牛帶你走進Spring的事務
(Spring事務管理器)
Spring通過AOP攔截所有需要事務管理的業(yè)務處理方法。
三、Spring事務屬性
Spring事務有幾個屬性,TransactionDefinition接口可以體現(xiàn)出來:
public interface TransactionDefinition {
// 事務傳播行為定義
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
// 事務隔離級別定義
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;
// 默認超時時間
int TIMEOUT_DEFAULT = -1;
// 獲取事務傳播行為
int getPropagationBehavior();
// 獲取事務隔離級別
int getIsolationLevel();
// 獲取事務超時時間
int getTimeout();
// 獲取事務是否只讀
boolean isReadOnly();
// 獲取事務名字
String getName();
}
接口的定義加上回滾規(guī)則,事務可以有以下五個基本配置:事務傳播行為、事務隔離級別、事務超時、事務只讀、回滾規(guī)則
所謂傳播行為(propagation behavior)指一個事務方法被另一個事務方法調用時,事務應該如何處理。被調用的方法可能在現(xiàn)有事務中運行,或者啟動一個新的事務,在自己事務內運行。
傳播行為含義解釋PROPAGATION_REQUIRED表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。否則,會啟動一個新的事務有且只有一個事務PROPAGATION_SUPPORTS表示當前方法不需要事務上下文,但是如果存在當前事務的話,那么該方法會在這個事務中運行如果方法單獨調用則是非事務執(zhí)行,如果方法被另一個有事務的方法調用,被調用方法則加入事務PROPAGATION_MANDATORY表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常如果單獨非事務調用會拋異常,必須被其它事務方法調用,加入到事務中。PROPAGATION_REQUIRED_NEW表示當前方法必須運行在它自己的事務中。一個新的事務將被啟動。如果存在當前事務,在該方法執(zhí)行期間,當前事務會被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager總是開啟一個新的事務,原調用事務存在的話會被掛起,直至事務完成。PROPAGATION_NOT_SUPPORTED表示該方法不應該運行在事務中。如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager總是非事務地執(zhí)行該方法,如果調用事務存在的話會被掛起,直至方法執(zhí)行完成PROPAGATION_NEVER表示當前方法不應該運行在事務上下文中。如果當前正有一個事務在運行,則會拋出異常總是非事務性執(zhí)行方法,否則拋出異常PROPAGATION_NESTED表示如果當前已經存在一個事務,那么該方法將會在嵌套事務中運行。嵌套的事務可以獨立于當前事務進行單獨地提交或回滾。如果當前事務不存在,那么其行為與PROPAGATION_REQUIRED一樣。注意各廠商對這種傳播行為的支持是有所差異的??梢詤⒖假Y源管理器的文檔來確認它們是否支持嵌套事務嵌套事務一個非常重要的概念就是內層事務依賴于外層事務。外層事務失敗時,會回滾內層事務所做的動作。而內層事務操作失敗并不會引起外層事務的回滾。
事務的執(zhí)行會存在并發(fā)的,隔離級別定義了一個事務受其它并發(fā)事務影響的程度。
有兩個表格:
并發(fā)事務引起的問題
問題定義出現(xiàn)原因臟讀讀到無效的數(shù)據當一個事務讀取了另一個事務修改但未提交的數(shù)據,如果修改回滾,則事務讀取了無效的數(shù)據。不可重復讀同一個事務中兩次相同查詢中,讀取到不同的數(shù)據一個事務兩次查詢期間,另一個并發(fā)事務對數(shù)據進行了更新?;米x同一個事務在兩次相同的查詢中,讀取到不同記錄數(shù)的數(shù)據一個事務兩次查詢期間,另一個并發(fā)事務進行了數(shù)據新增或刪除。
隔離級別
隔離級別說明并發(fā)事務可能引起的問題ISOLATION_DEFAULT使用后端數(shù)據庫默認的隔離級別具體情況具體分析ISOLATION_READ_UNCOMMITTED最低的隔離級別,允許讀取尚未提交的數(shù)據變更臟讀、不可重復讀、幻讀ISOLATION_READ_COMMITTED允許讀取并發(fā)事務已經提交的數(shù)據不可重復讀、幻讀ISOLATION_REPEATABLE_READ對同一字段的多次讀取結果一致,除非字段被本事務修改幻讀ISOLATION_SERIALIZABLE最高的隔離級別,完全服從ACID原則,通常通過鎖表實現(xiàn)(最慢)無
給定事務一個超時時間,如果特定時間事務沒有執(zhí)行完畢,事務會自動回滾。
設置了只讀事務,那么在此事務執(zhí)行過程中,其它事務對數(shù)據庫的修改對于該事務來說是透明的,即看不到其它事務修改后的數(shù)據。這通常用于執(zhí)行多次查詢來統(tǒng)計信息時,能夠保證數(shù)據的整體一致性。
回滾規(guī)則定義了哪些異常,事務會進行回滾。默認情況下,事務只有遇到運行時異常才會回滾,而在遇到檢查型異常時不會回滾。
四、Spring事務管理形式
使用TransactionTemplate或PlatformTransactionManager
TransactionTemplate tt = new TransactionTemplate();
tt.execute(status -> {
// 執(zhí)行操作
doSth();
// 返回操作結果
return obj;
});
參考:Spring事務配置的五種方式
六、總結
Spring定義了事務管理器的接口,具體實現(xiàn)由特定平臺來實現(xiàn);
Spring事務有五個屬性:事務傳播行為、事務隔離級別、事務超時、事務只讀、回滾規(guī)則;
傳播行為:required、supports、mandatory、required_new、not_support、never、nested;
隔離級別:default、read_uncommited、read_committed、repeatable_read、serializable;