Spring事務管理API有100個左右,其中最核心的API有3個,分別是TransactionDefinition
、 PlatformTransactionManager
、TransactionStatus
。TransactionDefinition
定義事務管理五個屬性,PlatformTransactionManager
執行具體的事務,TransactionStatus
提供控制事務執行和查詢事務狀態的方法。Spring事務管理主要API結構以下java
TransactionDefinition
接口是用於定義一個事務,它定義了Spring事務管理的五大屬性,在上一篇文章中有詳細介紹。Spring提供了一個該接口的默認實現類DefaultTransactionDefinition
,該類可用於大多數屬於管理狀況。若是該類不能知足需求,能夠經過實現TransactionDefinition
接口來定義本身的事務實現。TransactionDefinition
接口源碼以下:spring
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 = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8; int TIMEOUT_DEFAULT = -1; int getPropagationBehavior();//事務的傳播行爲 int getIsolationLevel();//事務的隔離級別 int getTimeout();//事務超時時間 boolean isReadOnly();//是否只讀 String getName(); }
PlatformTransactionManager
接口用於執行具體的事務,包括獲取當前事務狀態,提交事務、事務回滾等。PlatformTransactionManager
接口源碼以下:sql
public interface PlatformTransactionManager { //根據事務定義信息,得到當前狀態 TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException; //提交事務 void commit(TransactionStatus var1) throws TransactionException; //回滾事務 void rollback(TransactionStatus var1) throws TransactionException; }
TransactionStatus
接口表明了一個事務自己,提供了一個簡單的控制事務執行和查詢事務狀態的方法。PlatformTransactionManager
接口的getTransaction()方法會返回一個TransactionStatus
對象,該對象可能表明一個新的或者一個已經存在的事務。TransactionStatus
接口源碼以下:數據庫
public interface TransactionStatus extends SavepointManager, Flushable { boolean isNewTransaction();//是否一個新的事務 boolean hasSavepoint();// void setRollbackOnly();//將事務設置爲只能回滾,不容許提交 boolean isRollbackOnly();//查詢事務是否已有回滾標誌 void flush(); boolean isCompleted();//查詢事務是否結束 }
PlatformTransactionManager
根據TransactionDefinition
定義進行事務管理,管理過程當中事務存在多種不一樣的狀態,每一個事務狀態信息都經過TransactionStatus
進行表示。PlatformTransactionManager
的默認實現類AbstractPlatformTransactionManager
,針對不一樣的數據庫持久化操做技術,又分別有不一樣的實現類DataSourceTransactionManager
,HibernateTransactionManager
,JpaTransactionManager
三個實現類,還有其餘的。編程
Spring不直接進行事務管理,而是針對不一樣的平臺提供了多種事務管理器,將事務管理的職責委託給Jdbc、Hibernate、Jpa、iBatis等持久化機制所提供的相關平臺框架的事務機制來實現。Spring事務管理的接口是org.springframework.transaction.PlatformTransactionManager
,經過這個接口,Spring爲各個平臺提供了對應的事務管理器,至於具體的實現是各個平臺的事情Spring並不關心,這就是 Spring事務管理的一個優勢:爲不一樣的平臺事務API提供了一致的編程模型。session
JDBC事務框架
若是在項目開發中直接使用JDBC來進行持久化操做,DataSourceTransactionManager
會用來處理事務邊界。DataSourceTransactionManager
是經過調用Java.sql.Connection
來管理事務,然後者是經過DataSource獲取到的。經過調用鏈接的commit()方法來提交事務,一樣,事務失敗則經過調用rollback()方法進行回滾。爲了使用DataSourceTransactionManager
,你須要使用以下的XML將其裝配到應用程序的上下文定義中:分佈式
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
Hibernate事務spa
若是在實際項目開發中使用Hibernate來實現持久化操做,須要使用HibernateTransactionManager
。sessionFactory屬性須要裝配一個Hibernate的session工廠,HibernateTransactionManager
的實現細節是它將事務管理的職責委託給org.hibernate.Transaction
對象,然後者是從Hibernate Session中獲取到的。當事務成功完成時,HibernateTransactionManager
將會調用Transaction對象的commit()方法,反之,將會調用rollback()方法。對於Hibernate3,Hibernate事務的使用須要在Spring的配置文件上下文定義中添加以下<bean>的聲明:hibernate
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
Java持久化API事務(JPA)
若是在實際項目開發中使用JPA來實現持久化操做,那你須要使用Spring的JpaTransactionManager
來處理事務。JpaTransactionManager
只須要裝配一個JPA實體管理工廠(javax.persistence.EntityManagerFactory
接口的任意實現)。JpaTransactionManager
將與由工廠所產生的JPA EntityManager
合做來構建事務。你須要在Spring中以下配置JpaTransactionManager
:
`
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
>「 本訂閱號提供Java相關技術分享,從Java編程基礎到Java高級技術,從JavaWeb技術基礎Jsp、Servlet、JDBC到SSH、SSM開發框架,從REST風格接口設計到分佈式項目實戰。剖析主流開源技術框架,用親身實踐來譜寫深度Java技術日誌。「