您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么理解Spring事物抽象”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么理解Spring事物抽象”吧!
Spring事務(wù)抽象的關(guān)鍵是事務(wù)策略的概念。事務(wù)策略由TransactionManager
定義,特別是用于命令式事務(wù)管理的org.springframework.transaction.PlatformTransactionManager
接口和用于響應式事務(wù)管理的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; }
盡管你可以從應用程序代碼中以編程方式使用它,但它主要是一個服務(wù)提供接口(SPI)。由于PlatformTransactionManager
是接口,因此可以根據(jù)需要輕松對其進行模擬或存根。它與JNDI
之類的查找策略無關(guān)。與Spring框架IoC容器中的任何其他對象(或bean)一樣,定義了PlatformTransactionManager
實現(xiàn)。這一優(yōu)點使Spring框架事務(wù)成為值得抽象的,即使在使用JTA
時也是如此。與直接使用JTA
相比,你可以更輕松地測試事務(wù)代碼。
同樣,為了與Spring的理念保持一致,可以由任何PlatformTransactionManager
接口方法拋出的TransactionException
未檢查異常(也就是說,它擴展了java.lang.RuntimeException
類)。事物基礎(chǔ)架構(gòu)故障幾乎總是致命的。在極少數(shù)情況下,應用程序代碼實際上可以從事務(wù)失敗中恢復,應用程序開發(fā)人員仍然可以選擇捕獲和處理TransactionException
。實際一點是,開發(fā)人員沒有被迫這樣做。
getTransaction(..)
方法根據(jù)TransactionDefinition
參數(shù)返回TransactionStatus
對象。如果當前調(diào)用堆棧中存在匹配的事務(wù),則返回的TransactionStatus
可能表示一個新事務(wù)或一個現(xiàn)有事務(wù)。后一種情況的含義是,與Java EE事務(wù)上下文一樣,TransactionStatus
與執(zhí)行線程相關(guān)聯(lián)。
從Spring框架5.2開始,Spring還為使用響應式類型或Kotlin
協(xié)程的響應式應用程序提供了事務(wù)管理抽象。以下清單顯示了由org.springframework.transaction.ReactiveTransactionManager
定義的事務(wù)策略:
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; }
響應式事務(wù)管理器主要是服務(wù)提供接口(SPI),盡管你可以從應用程序代碼中以編程方式使用它。由于ReactiveTransactionManager
是接口,因此可以根據(jù)需要輕松對其進行模擬或存根。
TransactionDefinition
接口指定:
傳播:通常,事務(wù)范圍內(nèi)的所有代碼都在該事務(wù)中運行。但是,如果在已存在事務(wù)上下文的情況下運行事務(wù)方法,則可以指定行為。例如,代碼可以在現(xiàn)有事務(wù)中繼續(xù)運行(常見情況),或者可以暫?,F(xiàn)有事務(wù)并創(chuàng)建新事務(wù)。Spring提供了EJB
CMT
熟悉的所有事務(wù)傳播選項。要了解有關(guān)Spring中事務(wù)傳播的語義的信息,請參閱事務(wù)傳播。
隔離:此事務(wù)與其他事務(wù)的工作隔離的程度。例如,此事務(wù)能否看到其他事務(wù)未提交的寫入?
超時:該事務(wù)在超時之前將運行多長時間,并由基礎(chǔ)事務(wù)基礎(chǔ)結(jié)構(gòu)自動回滾。
只讀狀態(tài):當代碼讀取但不修改數(shù)據(jù)時,可以使用只讀事務(wù)。在某些情況下,例如使用Hibernate
時,只讀事務(wù)可能是有用的優(yōu)化。
這些設(shè)置反映了標準的事物概念。如有必要,請參考討論事務(wù)隔離級別和其他核心事務(wù)概念的資源。了解這些概念對于使用Spring框架或任何事務(wù)管理解決方案至關(guān)重要。
TransactionStatus
接口為事務(wù)代碼提供了一種控制事務(wù)執(zhí)行和查詢事務(wù)狀態(tài)的簡單方法。這些概念應該很熟悉,因為它們對于所有事務(wù)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中選擇聲明式還是編程式事務(wù)管理,定義正確的TransactionManager
實現(xiàn)都是絕對必要的。通常,你可以通過依賴注入來定義此實現(xiàn)。TransactionManager
實現(xiàn)通常需要了解其工作環(huán)境:JDBC
、JTA
、Hibernate
等。
TransactionManager
實現(xiàn)通常需要了解其工作環(huán)境:JDBC
、JTA
、Hibernate
等。以下示例顯示了如何定義本地PlatformTransactionManager
實現(xiàn)(在這種情況下,使用純JDBC
)。
你可以通過創(chuàng)建類似于以下內(nèi)容的bean來定義JDBC
數(shù)據(jù)源:
<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>
然后,相關(guān)的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="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jee https://www.springframework.org/schema/jee/spring-jee.xsd"> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/jpetstore"/> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> <!-- other <bean/> definitions here --> </beans>
JtaTransactionManager
不需要了解數(shù)據(jù)源(或任何其他特定資源),因為它使用了容器的全局事務(wù)管理基礎(chǔ)結(jié)構(gòu)。
dataSource
bean的先前定義使用jee名稱空間中的<jndi-lookup />標記。有關(guān)更多信息,參考JEE Schema。
你還可以輕松使用Hibernate
本地事務(wù),如以下示例所示。在這種情況下,你需要定義一個Hibernate
LocalSessionFactoryBean
,你的應用程序代碼可使用該Hibernate
LocalSessionFactoryBean
獲取Hibernate
Session
實例。
DataSource
bean定義與先前顯示的本地JDBC
示例相似,因此在以下示例中未顯示。
如果通過
JNDI
查找數(shù)據(jù)源(由任何非JTA
事務(wù)管理器使用)并由Java EE容器管理,則該數(shù)據(jù)源應該是非事務(wù)性的,因為Spring框架(而不是Java EE容器)管理事務(wù)。
在這種情況下,txManager
bean是HibernateTransactionManager
類型。就像DataSourceTransactionManager
需要引用數(shù)據(jù)源一樣,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
事務(wù),則應使用與前面的JDBC
JTA
示例相同的JtaTransactionManager
,如以下示例所示:
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
如果使用
JTA
,則無論使用哪種數(shù)據(jù)訪問技術(shù)(無論是JDBC
、Hibernate
JPA
或任何其他受支持的技術(shù)),事務(wù)管理器定義都應該相同。這是由于JTA
事務(wù)是全局事務(wù),它可以征用任何事務(wù)資源。
在所有這些情況下,無需更改應用程序代碼。你可以僅通過更改配置來更改事務(wù)的管理方式,即使更改意味著從本地事務(wù)轉(zhuǎn)移到全局事務(wù),反之亦然。
到此,相信大家對“怎么理解Spring事物抽象”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。