<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,  comments - 11,  trackbacks - 0

    6.3 Spring的事務(wù)

    Spring的事務(wù)管理不需與任何特定的事務(wù)API耦合。對(duì)不同的持久層訪問(wèn)技術(shù),編程式事務(wù)提供一致的事務(wù)編程風(fēng)格,通過(guò)模板化的操作一致性地管理事務(wù)。聲明式事務(wù)基于Spring AOP實(shí)現(xiàn),卻并不需要程序開發(fā)者成為AOP專家,亦可輕易使用Spring的聲明式事務(wù)管理。

    6.3.1 Spring支持的事務(wù)策略

    Spring事務(wù)策略是通過(guò)PlatformTransactionManager接口體現(xiàn)的,該接口是Spring事務(wù)策略的核心。該接口的源代碼如下:

    public interface PlatformTransactionManager

    {

    ??? //平臺(tái)無(wú)關(guān)的獲得事務(wù)的方法

    ??? TransactionStatus getTransaction(TransactionDefinition definition)

    ??????? throws TransactionException;

    ??? //平臺(tái)無(wú)關(guān)的事務(wù)提交方法

    ??? void commit(TransactionStatus status) throws TransactionException;

    ??? //平臺(tái)無(wú)關(guān)的事務(wù)回滾方法

    ??? void rollback(TransactionStatus status) throws TransactionException;

    }

    PlatformTransactionManager是一個(gè)與任何事務(wù)策略分離的接口,隨著底層不同事務(wù)策略切換,應(yīng)用必須采用不同的實(shí)現(xiàn)類。PlatformTransactionManager接口沒(méi)有與任何事務(wù)資源捆綁在一起,它可以適應(yīng)于任何的事務(wù)策略,結(jié)合Spring的IoC容器,可以向PlatformTransactionManager注入相關(guān)的平臺(tái)特性。

    PlatformTransactionManager接口有許多不同的實(shí)現(xiàn)類,應(yīng)用程序面向與平臺(tái)無(wú)關(guān)的接口編程,對(duì)不同平臺(tái)的底層支持,由PlatformTransactionManager接口的實(shí)現(xiàn)類完成。從而,應(yīng)用程序無(wú)須與具體的事務(wù)API耦合。因此,使用PlatformTransactionManager接口,可將代碼從具體的事務(wù)API中解耦出來(lái)。

    即使使用特定容器管理的JTA,代碼依然無(wú)須執(zhí)行JNDI查找,無(wú)須與特定的JTA資源耦合在一起。通過(guò)配置文件,JTA資源傳給PlatformTransactionManager的實(shí)現(xiàn)類。因此,程序的代碼可在JTA事務(wù)管理和非JTA事務(wù)管理之間輕松切換。

    在PlatformTransactionManager接口內(nèi),包含一個(gè)getTransaction(TransactionDefinition definition)方法,該方法根據(jù)一個(gè)TransactionDefinition參數(shù),返回一個(gè)TransactionStatus對(duì)象。TransactionStatus對(duì)象表示一個(gè)事務(wù)。TransactionStatus被關(guān)聯(lián)在當(dāng)前執(zhí)行的線程。

    getTransaction(TransactionDefinition definition)返回的TransactionStatus對(duì)象,可能是一個(gè)新的事務(wù),也可能是一個(gè)已經(jīng)存在的事務(wù)對(duì)象。如果當(dāng)前執(zhí)行的線程已經(jīng)處于事務(wù)管理下,返回當(dāng)前線程的事務(wù)對(duì)象,否則,返回當(dāng)前線程的調(diào)用堆棧已有的事務(wù)對(duì)象。

    TransactionDefinition接口定義了一個(gè)事務(wù)規(guī)則,該接口必須指定如下幾個(gè)屬性值:

    ?? ● 事務(wù)隔離,當(dāng)前事務(wù)和其他事務(wù)的隔離程度。例如,這個(gè)事務(wù)能否看到其他事務(wù)未提交的數(shù)據(jù)等。

    ?? ● 事務(wù)傳播,通常,在事務(wù)中執(zhí)行的代碼都會(huì)在當(dāng)前事務(wù)中運(yùn)行。但是,如果一個(gè)事務(wù)上下文已經(jīng)存在,有幾個(gè)選項(xiàng)可指定該事務(wù)性方法的執(zhí)行行為。例如,大多數(shù)情況下,簡(jiǎn)單地在現(xiàn)有的事務(wù)上下文中運(yùn)行;或者掛起現(xiàn)有事務(wù),創(chuàng)建一個(gè)新的事務(wù)。Spring提供EJB CMT(Contain Manager Transaction,容器管理事務(wù))中所有的事務(wù)傳播選項(xiàng)。

    ?? ● 事務(wù)超時(shí),事務(wù)在超時(shí)前能運(yùn)行多久。事務(wù)的最長(zhǎng)持續(xù)時(shí)間。如果事務(wù)一直沒(méi)有被提交或回滾,將在超出該時(shí)間后,系統(tǒng)自動(dòng)回滾事務(wù)。

    ?? ● 只讀狀態(tài),只讀事務(wù)不修改任何數(shù)據(jù)。在某些情況下(例如使用Hibernate時(shí)),只讀事務(wù)是非常有用的優(yōu)化。

    TransactionStatus代表事務(wù)本身,它提供了簡(jiǎn)單的控制事務(wù)執(zhí)行和查詢事務(wù)狀態(tài)的方法。這些方法在所有的事務(wù)API中都是相同的。TransactionStatus接口的源代碼如下:

    public interface TransactionStatus

    {

    ??? //判斷事務(wù)是否是新建的事務(wù)

    ??? boolean isNewTransaction();

    ??? //設(shè)置事務(wù)回滾

    ??? void setRollbackOnly();

    ??? //查詢事務(wù)是否已有回滾標(biāo)志

    ??? boolean isRollbackOnly();

    }

    Spring的事務(wù)管理由PlatformTransactionManager的不同實(shí)現(xiàn)類完成。在Spring上下文中配置PlatformTransactionManager Bean時(shí),必須針對(duì)不同環(huán)境提供不同的實(shí)現(xiàn)類。

    下面提供不同的持久層訪問(wèn)環(huán)境,及其對(duì)應(yīng)的PlatformTransactionManager實(shí)現(xiàn)類的 配置。

    JDBC數(shù)據(jù)源的局部事務(wù)策略:

    <?xml version="1.0" encoding="GBK"?>

    <!-- 指定Spring配置文件的根元素,以及Spring配置文件的Schema信息 -->

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans

    ?????? http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 定義數(shù)據(jù)源Bean,使用C3P0數(shù)據(jù)源實(shí)現(xiàn) -->

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

    ??? <!-- 指定連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng) -->

    ??? <property name="driverClass" value="com.mysql.jdbc.Driver"/>

    ??? <!-- 指定連接數(shù)據(jù)庫(kù)的URL -->

    ??? <property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/>

    ??? <!-- 指定連接數(shù)據(jù)庫(kù)的用戶名 -->

    ??? <property name="user" value="root"/>

    ??? <!-- 指定連接數(shù)據(jù)庫(kù)的密碼 -->

    ??? <property name="password" value="32147"/>

    ??? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的最大連接數(shù) -->

    ??? <property name="maxPoolSize" value="40"/>

    ??? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的最小連接數(shù) -->

    ??? <property name="minPoolSize" value="1"/>

    ??? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的初始化連接數(shù) -->

    ??? <property name="initialPoolSize" value="1"/>

    ??? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的連接最大空閑時(shí)間 -->

    ??? <property name="maxIdleTime" value="20"/>

    </bean>

    <!-- 配置JDBC數(shù)據(jù)源的局部事務(wù)管理器 -->

    <!-- 使用DataSourceTransactionManager 類,該類實(shí)現(xiàn)PlatformTransactionManager接口 -->

    <!-- 針對(duì)采用數(shù)據(jù)源連接的特定實(shí)現(xiàn) -->

    <bean id="transactionManager"

    ??????? class="org.springframework.jdbc.datasource.
    ??????? DataSourceTransactionManager">

    ??????? <!-- DataSourceTransactionManager bean需要依賴注入一個(gè)DataSource
    ??????? bean的引用 -->

    ??? ???? <property name="dataSource" ref="dataSource"/>

    ??? </bean>

    </beans>

    對(duì)于容器管理JTA數(shù)據(jù)源,全局事務(wù)策略的配置文件如下:

    <?xml version="1.0" encoding="GBK"?>

    <!-- 指定Spring配置文件的根元素,以及Spring配置文件的Schema信息 -->

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd">

    ??? <!-- 配置JNDI數(shù)據(jù)源Bean -->

    ??? <bean id="dataSource" class="org.springframework.jndi.
    ??? JndiObjectFactoryBean">

    ??? <!-- 容器管理數(shù)據(jù)源的JNDI -->

    ??? ???? <property name="jndiName" value="jdbc/jpetstore"/>

    ??? </bean>

    ??? <!-- 使用JtaTransactionManager類,該類實(shí)現(xiàn)PlatformTransactionManager接
    ??? 口 -->

    ??? <!-- 針對(duì)采用全局事務(wù)管理的特定實(shí)現(xiàn) -->

    ??? <!-- JtaTransactionManager不需要知道數(shù)據(jù)源,或任何其他特定資源 -->

    ??? <!-- 因?yàn)樗褂萌萜鞯娜质聞?wù)管理 -->

    ??? <bean id="transactionManager"

    ??????? class="org.springframework.transaction.jta.
    ??????? JtaTransactionManager" />

    </beans>

    對(duì)于采用Hibernate持久層訪問(wèn)策略時(shí),局部事務(wù)策略的配置文件如下:

    <?xml version="1.0" encoding="GBK"?>

    <!-- 指定Spring配置文件的根元素,以及Spring配置文件的Schema信息 -->

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd">

    ??? <!-- 定義數(shù)據(jù)源Bean,使用C3P0數(shù)據(jù)源實(shí)現(xiàn) -->

    ??? <bean id="dataSource" class="com.mchange.v2.c3p0.
    ??? ComboPooledDataSource" destroy-method="close">

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng) -->

    ??? ??? <property name="driverClass" value="com.mysql.jdbc.Driver"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)的URL -->

    ??? ??? <property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)的用戶名 -->

    ??? ??? <property name="user" value="root"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)的密碼 -->

    ??? ??? <property name="password" value="32147"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的最大連接數(shù) -->

    ??? ??? <property name="maxPoolSize" value="40"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的最小連接數(shù) -->

    ??? ??? <property name="minPoolSize" value="1"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的初始化連接數(shù) -->

    ??? ??? <property name="initialPoolSize" value="1"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的連接最大空閑時(shí)間 -->

    ??? ??? <property name="maxIdleTime" value="20"/>

    ??? </bean>

    ??? <!-- 定義Hibernate的SessionFactory -->

    ??? <bean id="sessionFactory" class="org.springframework.orm.hibernate3.
    ??? LocalSessionFactoryBean">

    ??????? <!-- 依賴注入SessionFactory所需的數(shù)據(jù)源,正是上文定義的dataSource -->

    ??????? <property name="dataSource" ref="dataSource"/>

    ??????? <!-- mappingResources屬性用來(lái)列出全部映射文件 -->

    ??????? <property name="mappingResources">

    ??????????? <list>

    ??????????????? <!-- 以下用來(lái)列出所有的PO映射文件 -->

    ??????????????? <value>lee/MyTest.hbm.xml</value>

    ??????????? </list>

    ??????? </property>

    ????????? <!-- 定義Hibernate的SessionFactory的屬性 -->

    ??????? <property name="hibernateProperties">

    ??????? ???? <props>

    ??????????????? <!-- 指定Hibernate的連接方言 -->

    ??????????? ??? <prop key="hibernate.dialect">org.hibernate.dialect.
    ??????????? ??? MySQLDialect</prop>

    ??????????????? <!-- 是否根據(jù)Hibernate映射創(chuàng)建數(shù)據(jù)表時(shí),選擇create、update、
    ??????????????? create-drop -->

    ??????????? ????? <prop key="hibernate.hbm2ddl.auto">update</prop>

    ??????? ???? </props>

    ??????? </property>

    ??? </bean>

    ??? <!-- 配置Hibernate的局部事務(wù)管理器 -->

    ??? <!-- 使用HibernateTransactionManager類,該類是PlatformTransactionManager
    ??? 接口,針對(duì)采用Hibernate持久化連接的特定實(shí)現(xiàn) -->

    ??? <bean id="transactionManager"

    ??? class="org.springframework.orm.hibernate3.
    ??? HibernateTransactionManager">

    ??????????? <!-- HibernateTransactionManager Bean需要依賴注入一個(gè)
    ??????????? SessionFactorybean的引用 -->

    ??? ???? <property name="sessionFactory" ref="sessionFactory"/>

    ???? </bean>

    </beans>

    對(duì)于采用Hibernate持久層訪問(wèn)策略時(shí),全局事務(wù)策略的配置文件如下:

    <?xml version="1.0" encoding="GBK"?>

    <!-- 指定Spring配置文件的根元素,以及Spring配置文件的Schema信息 -->

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd">

    ??? <!-- 配置JNDI數(shù)據(jù)源Bean -->

    ??? <bean id="dataSource" class="org.springframework.jndi.
    ??? JndiObjectFactoryBean">

    ??????? <!-- 容器管理數(shù)據(jù)源的JNDI -->

    ??? ???? <property name="jndiName" value="jdbc/jpetstore"/>

    ??? </bean>

    ??? <!--定義Hibernate的SessionFactory -->

    ??? <bean id="sessionFactory" class="org.springframework.orm.hibernate3.
    ??? LocalSessionFactoryBean">

    ??????? <!-- 依賴注入SessionFactory所需的數(shù)據(jù)源,正是上文定義的dataSource Bean -->

    ??????? <property name="dataSource" ref="dataSource"/>

    ??????? <!-- mappingResources屬性用來(lái)列出全部映射文件 -->

    ??????? <property name="mappingResources">

    ??????????? <list>

    ??? ????????????? <!-- 以下用來(lái)列出所有的PO映射文件 -->

    ??????????????? <value>lee/MyTest.hbm.xml</value>

    ??????????? </list>

    ??????? </property>

    ????????? <!-- 定義Hibernate的SessionFactory的屬性 -->

    ??????? <property name="hibernateProperties">

    ??????? ???? <props>

    ??????????????? <!-- 指定Hibernate的連接方言 -->

    ??????????? ??? <prop key="hibernate.dialect">org.hibernate.dialect.
    ??????????????? MySQLDialect</prop>

    ??????????????? <!-- 是否根據(jù)Hiberante映射創(chuàng)建數(shù)據(jù)表時(shí),選擇create、update、
    ??????????????? create-drop -->

    ??????????? ????? <prop key="hibernate.hbm2ddl.auto">update</prop>

    ??????? ???? </props>

    ???? ???? </property>

    ??? </bean>

    ??? <!-- 使用JtaTransactionManager類,該類是PlatformTransactionManager接口,
    ??????????? 針對(duì)采用數(shù)據(jù)源連接的特定實(shí)現(xiàn) -->

    ??? <!-- JtaTransactionManager不需要知道數(shù)據(jù)源,或任何其他特定資源,

    ??????????? 因?yàn)槭褂萌萜鞯娜质聞?wù)管理 -->

    ??? <bean id="transactionManager"

    ??????? ?? class="org.springframework.transaction.jta.
    ??????? ?? JtaTransactionManager" />

    </beans>

    不論采用哪種持久層訪問(wèn)技術(shù),只要使用JTA數(shù)據(jù)源,Spring事務(wù)管理器的配置都是一樣的,因?yàn)樗鼈兌疾捎玫氖侨质聞?wù)管理。

    可以看到,僅僅通過(guò)配置文件的修改,就可以在不同的事務(wù)管理策略間切換,即使從局部事務(wù)到全局事務(wù)的切換。

    提示:Spring所支持的事務(wù)策略非常靈活,Spring的事務(wù)策略允許應(yīng)用程序在不同事務(wù)策略之間自由切換,即使需要在局部事務(wù)策略和全局事務(wù)策略之間切換,只需要修改配置文件,而應(yīng)用程序的代碼無(wú)須任何改變。這種靈活的設(shè)計(jì),又何嘗不是因?yàn)槊嫦蚪涌诰幊處?lái)的優(yōu)勢(shì),可見(jiàn)面向接口編程給應(yīng)用程序更好的適應(yīng)性。

    posted on 2009-07-19 10:18 jadmin 閱讀(74) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 99re免费在线视频| 免费人成视频在线观看视频| 亚洲人成网站免费播放| 亚洲AV中文无码乱人伦在线视色| 中文字幕乱码系列免费| 亚洲国产av一区二区三区丶| 国产在线19禁免费观看国产| 国产精品白浆在线观看免费| 亚洲性色AV日韩在线观看| 亚洲中文字幕无码久久2017| 在线观看免费人成视频色9| 黄页网址大全免费观看12网站| 亚洲精品美女在线观看| 亚洲日韩VA无码中文字幕| av免费不卡国产观看| 成人无码视频97免费| 亚洲精品无码久久久久牙蜜区| 国产亚洲欧洲Aⅴ综合一区| 性色av免费观看| 最近2018中文字幕免费视频| 国产精品亚洲AV三区| 亚洲视频在线不卡| 国产亚洲情侣一区二区无码AV| 国产福利在线免费| 久久久免费精品re6| h片在线观看免费| 最好免费观看高清在线| 亚洲精品色播一区二区| 911精品国产亚洲日本美国韩国| 四虎精品亚洲一区二区三区| 一级一片免费视频播放| 亚洲欧洲另类春色校园网站| 国产成人A人亚洲精品无码| 日韩免费无码视频一区二区三区| 午夜亚洲国产精品福利| 亚洲人成免费网站| 91久久亚洲国产成人精品性色| 久久久久亚洲AV综合波多野结衣| 好吊妞在线成人免费| 麻豆一区二区免费播放网站| 99热这里有免费国产精品|