Spring 5 中文解析資料儲存篇-理解Spring事物抽象
1.2 理解Spring框架事物抽象
Spring事務抽象的關鍵是事務策略的概念。事務策略由TransactionManager
定義,特別是用於命令式事務管理的org.springframework.transaction.PlatformTransactionManager
介面和用於響應式事務管理的org.springframework.transaction.ReactiveTransactionManager
介面。以下清單顯示了PlatformTransactionManager
API的定義:
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
儘管你可以從應用程式程式碼中以使用它,但它主要是一個服務提供介面(SPI)。由於PlatformTransactionManager
是介面,因此可以根據需要輕鬆對其進行模擬或存根。它與JNDI
之類的查詢策略無關。與Spring框架IoC容器中的任何其他物件(或bean)一樣,定義了PlatformTransactionManager
實現。這一優點使Spring框架事務成為值得抽象的,即使在使用JTA
時也是如此。與直接使用JTA
相比,你可以更輕鬆地測試事務程式碼。
同樣,為了與Spring的理念保持一致,可以由任何PlatformTransactionManager
介面方法丟擲的TransactionException
未檢查異常(也就是說,它擴充套件了java.lang.RuntimeException
類)。事物基礎架構故障幾乎總是致命的。在極少數情況下,應用程式程式碼實際上可以從事務失敗中恢復,應用程式開發人員仍然可以選擇捕獲和處理TransactionException
。實際一點是,開發人員沒有被迫這樣做。
getTransaction(..)
方法根據TransactionDefinition
引數返回TransactionStatus
物件。如果當前呼叫堆疊中存在匹配的事務,則返回的TransactionStatus
可能表示一個新事務或一個現有事務。後一種情況的含義是,與Java EE事務上下文一樣,TransactionStatus
與執行執行緒相關聯。
從Spring框架5.2開始,Spring還為使用響應式型別或Kotlin
協程的響應式應用程式提供了事務管理抽象。以下清單顯示了由org.springframework.transaction.ReactiveTransactionManager
定義的事務策略:
public interface ReactiveTransactionManager extends TransactionManager {
Mono<ReactiveTransaction> getReactiveTransaction(TransactionDefinition definition) throws TransactionException;
Mono<Void> commit(ReactiveTransaction status) throws TransactionException;
Mono<Void> rollback(ReactiveTransaction status) throws TransactionException;
}
響應式事務管理器主要是服務提供介面(SPI),儘管你可以從應用程式程式碼中以使用它。由於ReactiveTransactionManager
是介面,因此可以根據需要輕鬆對其進行模擬或存根。
TransactionDefinition
介面指定:
- 傳播:通常,事務範圍內的所有程式碼都在該事務中執行。但是,如果在已存在事務上下文的情況下執行事務方法,則可以指定行為。例如,程式碼可以在現有事務中繼續執行(常見情況),或者可以暫停現有事務並建立新事務。Spring提供了
EJB
CMT
熟悉的所有事務傳播選項。要了解有關Spring中事務傳播的語義的資訊,請參閱。 - 隔離:此事務與其他事務的工作隔離的程度。例如,此事務能否看到其他事務未提交的寫入?
- 超時:該事務在超時之前將執行多長時間,並由基礎事務基礎結構自動回滾。
- 只讀狀態:當程式碼讀取但不修改資料時,可以使用只讀事務。在某些情況下,例如使用
Hibernate
時,只讀事務可能是有用的最佳化。
這些設定反映了標準的事物概念。如有必要,請參考討論事務隔離級別和其他核心事務概念的資源。瞭解這些概念對於使用Spring框架或任何事務管理解決方案至關重要。
TransactionStatus
介面為事務程式碼提供了一種控制事務執行和查詢事務狀態的簡單方法。這些概念應該很熟悉,因為它們對於所有事務API都是通用的。以下清單顯示了TransactionStatus
介面:
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {
@Override
boolean isNewTransaction();
boolean hasSavepoint();
@Override
void setRollbackOnly();
@Override
boolean isRollbackOnly();
void flush();
@Override
boolean isCompleted();
}
無論你在Spring中選擇宣告式還是程式設計式事務管理,定義正確的TransactionManager
實現都是絕對必要的。通常,你可以透過依賴注入來定義此實現。TransactionManager
實現通常需要了解其工作環境:JDBC
、JTA
、Hibernate
等。
TransactionManager
實現通常需要了解其工作環境:JDBC
、JTA
、Hibernate
等。以下示例顯示瞭如何定義本地PlatformTransactionManager
實現(在這種情況下,使用純JDBC
)。
你可以透過建立類似於以下內容的bean來定義JDBC
資料來源:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
然後,相關的PlatformTransactionManager
Bean定義將引用DataSource
定義。它應類似於以下示例:
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
如果你在Java EE容器中使用JTA
,則可以使用透過JNDI
獲得的容器DataSource
以及Spring的JtaTransactionManager
。以下示例顯示了JTA
和JNDI
查詢:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""
xmlns:xsi=""
xmlns:jee=""
xsi:schemaLocation="
">
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/jpetstore"/>
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<!-- other <bean/> definitions here -->
</beans>
JtaTransactionManager
不需要了解資料來源(或任何其他特定資源),因為它使用了容器的全域性事務管理基礎結構。
dataSource
bean的先前定義使用jee名稱空間中的標記。有關更多資訊,參考。
你還可以輕鬆使用Hibernate
本地事務,如以下示例所示。在這種情況下,你需要定義一個Hibernate
LocalSessionFactoryBean
,你的應用程式程式碼可使用該Hibernate
LocalSessionFactoryBean
獲取Hibernate
Session
例項。
DataSource
bean定義與先前顯示的本地JDBC
示例相似,因此在以下示例中未顯示。
如果透過
JNDI
查詢資料來源(由任何非JTA
事務管理器使用)並由Java EE容器管理,則該資料來源應該是非事務性的,因為Spring框架(而不是Java EE容器)管理事務。
在這種情況下,txManager
bean是HibernateTransactionManager
型別。就像DataSourceTransactionManager
需要引用資料來源一樣,HibernateTransactionManager
需要引用SessionFactory
。以下示例宣告瞭sessionFactory
和txManager
bean:
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=${hibernate.dialect}
</value>
</property>
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
如果使用Hibernate
和Java EE容器管理的JTA
事務,則應使用與前面的JDBC
JTA
示例相同的JtaTransactionManager
,如以下示例所示:
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
如果使用
JTA
,則無論使用哪種資料訪問技術(無論是JDBC
、Hibernate
JPA
或任何其他受支援的技術),事務管理器定義都應該相同。這是由於JTA
事務是全域性事務,它可以徵用任何事務資源。
在所有這些情況下,無需更改應用程式程式碼。你可以僅透過更改配置來更改事務的管理方式,即使更改意味著從本地事務轉移到全域性事務,反之亦然。
作者
個人從事金融行業,就職過易極付、思建科技、某網約車平臺等重慶一流技術團隊,目前就職於某銀行負責統一支付系統建設。自身對金融行業有強烈的愛好。同時也實踐大資料、資料儲存、自動化整合和部署、分散式微服務、響應式程式設計、人工智慧等領域。同時也熱衷於技術分享創立公眾號和部落格站點對知識體系進行分享。
部落格地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/430/viewspace-2826257/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – MongoDBSpring BootMongoDB
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – MySQLSpring BootMySql
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – MyBatis整合Spring BootMyBatis
- Spring Boot資料儲存最佳實踐 - AhadSpring Boot
- 讀書筆記5-資料儲存篇筆記
- spring ioc原理解析Spring
- Spring Session原理解析SpringSession
- Spring Boot 事物回滾Spring Boot
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – 資料訪問與多資料來源配置Spring Boot
- Spring Cloud Config採用資料庫儲存配置內容SpringCloud資料庫
- Spring Boot實戰系列(2)資料儲存之NoSQL資料庫MongoDBSpring BootSQL資料庫MongoDB
- spring5原始碼-ioc抽象層次設計 與 aop流程理解Spring原始碼抽象
- Spring-Boot 多資料來源配置+動態資料來源切換+多資料來源事物配置實現主從資料庫儲存分離Springboot資料庫
- Spring Boot整合Spring Cloud Vault進行安全儲存Spring BootCloud
- [Spring 深度解析]第5章 Spring之DAOSpring
- spring 異常 事物不回滾Spring
- 使用Hazelcast作為Spring資料儲存庫的開源案例ASTSpring
- VSAN儲存結構解析+儲存資料恢復案例資料恢復
- Spring Cloud Gateway 資料庫儲存路由資訊的擴充套件方案SpringCloudGateway資料庫路由套件
- Spring5原始碼深度解析(一)之理解Configuration註解Spring原始碼
- Spring的事物回滾問題Spring
- Spring系列之不同資料庫異常如何抽象的?Spring資料庫抽象
- MyRocks儲存引擎資料結構解析儲存引擎資料結構
- Spring Boot:使用Redis儲存技術Spring BootRedis
- iOS開發資料儲存篇—iOS中的幾種資料儲存方式iOS
- redis-5.資料儲存格式Redis
- spring 原始碼解析之開篇Spring原始碼
- spring boot環境抽象Spring Boot抽象
- Spring系列之事物是如何管理的Spring
- Spring整合Quartz案例使用RAM儲存方式Springquartz
- Spring整合Quartz案例使用JDBC儲存方式SpringquartzJDBC
- 深入理解Spring系列之十三:IntrospectorCleanupListener解析SpringROS
- #第9篇分享:python資料儲存-MySQL資料庫PythonMySql資料庫
- 雲端儲存抽象層-FluentStorage抽象
- 資料儲存--檔案儲存
- Spring系列之JDBC對不同資料庫異常如何抽象的?SpringJDBC資料庫抽象
- 雲資料庫RDS儲存能力進化解析!資料庫
- 使用Spring Data建立只讀儲存庫 | BaeldungSpring