詳解阿里P7架構(gòu)師是怎么在Spring中實(shí)現(xiàn)事務(wù)暫停

摘要

Spring框架是一個(gè)流行的基于輕量級(jí)控制反轉(zhuǎn)容器的Java/J2EE應(yīng)用框架,尤其在數(shù)據(jù)訪問(wèn)和事務(wù)管理方面的能力是眾所周知的。Spring的聲明性事務(wù)分離可以應(yīng)用到任何POJO目標(biāo)對(duì)象,并且包含所有EJB基于容器管理事務(wù)中的已聲明事務(wù)。后臺(tái)的事務(wù)管理器支持簡(jiǎn)單的基于JDBC的事務(wù)和全功能的基于JTA的J2EE事務(wù)。

這篇文章詳細(xì)的討論了Spring的事務(wù)管理特性。重點(diǎn)是如何在使用JTA作為后臺(tái)事務(wù)策略的基礎(chǔ)上讓POJO利用Spring的聲明性事務(wù),這也顯示了Spring的事務(wù)服務(wù)可以無(wú)縫地與J2EE服務(wù)器(如BEA WebLogic Server的事務(wù)協(xié)調(diào)器)的事務(wù)協(xié)調(diào)器進(jìn)行交互,作為EJB CMT傳統(tǒng)事務(wù)分離方式的一個(gè)替代者。

POJO的聲明性事務(wù)

作為Spring聲明性事務(wù)分離方式的樣例,讓我們來(lái)看一下Spring的樣例應(yīng)用PetClinic的中心服務(wù)外觀中的配置:

清單1

<bean id="dataSource" 
   class="org.springframework.jndi.JndiObjectFactoryBean">
     <property name="jndiName">
        <value>java:comp/env/jdbc/petclinic</value>
     </property>
</bean>
<bean id="transactionManager" 
   class="org.springframework.transaction.jta.JtaTransactionManager"/>
<bean id="clinicTarget" 
   class="org.springframework.samples.petclinic.jdbc.JdbcClinic">
    <property name="dataSource"><ref bean="dataSource"/></property>
</bean>
<bean id="clinic" 
   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager"><ref bean="transactionManager"/></property>
    <property name="target"><ref bean="clinicTarget"/></property>
    <property name="transactionAttributes">
        <props>
            <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="store*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

他遵循Spring的標(biāo)準(zhǔn)XMLBean定義格式。定義了

  1. 一個(gè)DataSource引用,指向一個(gè)JNDI位置—在J2EE服務(wù)器管理下這將從JNDI環(huán)境中獲取特定的DataSource。
  2. 一個(gè)應(yīng)用服務(wù)實(shí)現(xiàn)—這是一個(gè)POJO,封裝了業(yè)務(wù)和數(shù)據(jù)訪問(wèn)邏輯。在這里實(shí)現(xiàn)了應(yīng)用中的Clinic服務(wù)接口。
  3. 一個(gè)應(yīng)用服務(wù)的事務(wù)代理—這個(gè)代理為目標(biāo)服務(wù)定義了事務(wù)屬性,匹配特定的方法名模式并為之創(chuàng)建相應(yīng)的事務(wù)。在實(shí)際的事務(wù)管理中,代理指向一個(gè)PlatformTransactionManager實(shí)現(xiàn)。

注意:除了顯式的代理定義,Spring還支持自動(dòng)代理機(jī)制和通過(guò)Commons Attributes或J2SE 5.0注解實(shí)現(xiàn)源程序級(jí)的元數(shù)據(jù)使用。這些可選方法的討論超過(guò)了本文的范圍??梢詤⒖糞pring的文檔來(lái)了解相關(guān)細(xì)節(jié)。

業(yè)務(wù)接口和業(yè)務(wù)實(shí)現(xiàn)是特定于應(yīng)用的并且不需要關(guān)心Spring或者Spring的事務(wù)管理。普通Java對(duì)象可以作為服務(wù)的目標(biāo)對(duì)象,而且任何普通Java接口可以作為服務(wù)的接口。下面是一個(gè)Clinic接口的示例:

清單2

public interface Clinic {
    Pet loadPet(int id);
    void storePet(Pet pet);
    ...
}

這個(gè)接口的實(shí)現(xiàn)如下顯示,假設(shè)他使用JDBC來(lái)執(zhí)行必要的數(shù)據(jù)訪問(wèn)。他通過(guò)bean屬性的設(shè)置方法來(lái)獲取JDBC的DataSource;這與上面的配置中的dataSource屬性定義相對(duì)應(yīng)。

清單3

public class JdbcClinic implements Clinic {
    private DataSource dataSource;
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    public Pet loadPet(int id) {
        try {
            Connection con = this.dataSource.getConnection();
            ...
        }
        catch (SQLException ex) {
            ...
        }
    }
    public void storePet(Pet pet) {
        try {
            Connection con = this.dataSource.getConnection();
            ...
        }
        catch (SQLException ex) {
            ...
        }
    }
    ...
}

如你所見(jiàn),代碼相當(dāng)直接。我們使用一個(gè)簡(jiǎn)單的Java對(duì)象,而事務(wù)管理由事務(wù)代理來(lái)處理,這個(gè)我們會(huì)在下面討論。
注意在PetClinic示例應(yīng)用中實(shí)際的基于JDBC的Clinic實(shí)現(xiàn)利用了Spring的JDBC支持類來(lái)避免直接使用JDBC的API。雖然Spring的事務(wù)管理也可以與普通的基于JDBC實(shí)現(xiàn)一起工作,就向上面的示例。

定義事務(wù)代理

除了JdbcClinic實(shí)例以外,配置中也定義了一個(gè)事務(wù)代理。如果愿意這個(gè)代理所暴露的實(shí)際接口也可以顯式定義。默認(rèn)情況下,所有由目標(biāo)對(duì)象實(shí)現(xiàn)的接口都暴露出來(lái),在這個(gè)例子中就是應(yīng)用的Clinic服務(wù)接口。

從客戶端的觀點(diǎn)來(lái)看,"clinic" bean只是這個(gè)應(yīng)用的Clinic接口的實(shí)現(xiàn)。客戶端不需要知道這會(huì)被一個(gè)事務(wù)代理所處理。這就是接口的能力:一個(gè)直接的目標(biāo)對(duì)象的引用可以容易的被一個(gè)實(shí)現(xiàn)相同接口的代理所代替—在這兒就是一個(gè)隱式創(chuàng)建事務(wù)的代理。
代理的具體事務(wù)行為會(huì)由為根據(jù)特定的方法或方法命名模式而定義的事務(wù)屬性來(lái)驅(qū)動(dòng),就像下面的例子所示:

清單3

<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="store*">PROPAGATION_REQUIRED</prop>

Key屬性決定代理將為方法提供什么樣的事務(wù)行為。這個(gè)屬性的最重要部分就是事務(wù)傳播行為。下面是一些可選的屬性值

  1. PROPAGATION_REQUIRED --支持當(dāng)前的事務(wù),如果不存在就創(chuàng)建一個(gè)新的。這是最常用的選擇。
  2. PROPAGATION_SUPPORTS --支持當(dāng)前的事務(wù),如果不存在就不使用事務(wù)。
  3. PROPAGATION_MANDATORY --支持當(dāng)前的事務(wù),如果不存在就拋出異常。
  4. PROPAGATION_REQUIRES_NEW --創(chuàng)建一個(gè)新的事務(wù),并暫停當(dāng)前的事務(wù)(如果存在)。
  5. PROPAGATION_NOT_SUPPORTED --不使用事務(wù),并暫停當(dāng)前的事務(wù)(如果存在)。
  6. PROPAGATION_NEVER --不使用事務(wù),如果當(dāng)前存在事務(wù)就拋出異常。
  7. PROPAGATION_NESTED --如果當(dāng)前存在事務(wù)就作為嵌入事務(wù)執(zhí)行,否則與PROPAGATION_REQUIRED類似。

前6個(gè)事務(wù)策略與EJB的CMT類似,而且使用相同的常量名,因此對(duì)EJB開發(fā)人員來(lái)說(shuō)是很親切的。第7個(gè)策略PROPAGATION_NESTED是Spring提供的一個(gè)變體:他需要事務(wù)管理器(如DataSourceTransactionManager)提供類似JDBC3.0那樣的保存點(diǎn)API來(lái)嵌套事務(wù)行為或者通過(guò)
JTA支持嵌套事務(wù)。

事務(wù)屬性中的readOnly標(biāo)識(shí)指示相應(yīng)的事務(wù)應(yīng)該作為一個(gè)只讀事務(wù)來(lái)優(yōu)化。這是一個(gè)優(yōu)化提示:一些事務(wù)策略在這種情況下可以得到很好的性能優(yōu)化,如使用ORM工具如Hibernate或TopLink時(shí)避免臟數(shù)據(jù)檢查(“flush”嘗試)。

在事務(wù)屬性中還有一個(gè)“timeout”選項(xiàng)來(lái)定義事務(wù)的超時(shí)秒數(shù)。在JTA中,這個(gè)屬性會(huì)簡(jiǎn)單地傳遞給J2EE服務(wù)器的事務(wù)協(xié)調(diào)器并被正確地解釋。

使用事務(wù)代理

在運(yùn)行時(shí),客戶端會(huì)取得一個(gè)“clinic”引用并轉(zhuǎn)換為Clinic接口,然后調(diào)用如loadPet或storePet方法。這就隱式地使用了Spring的事務(wù)代理,通過(guò)“事務(wù)解釋器”在目標(biāo)對(duì)象中注冊(cè);這樣一個(gè)新的事務(wù)就創(chuàng)建了,然后具體的工作就會(huì)代理給JdbcClinic的目標(biāo)方法。
圖1示例了一個(gè)使用“建議鏈”并到達(dá)最后目標(biāo)的AOP代理的潛在概念。在這個(gè)示例中,唯一的建議是一個(gè)事務(wù)解釋器用來(lái)包裝目標(biāo)方法的事務(wù)行為。這是一種用來(lái)在聲明性事務(wù)功能下使用的基于代理的AOP。

Figure 1. An AOP proxy with an advisor chain and a target at the end

例如,一個(gè)PetClinic應(yīng)用的WEB層組件可以執(zhí)行ServletContext定位來(lái)獲取Spring WebApplicationContext的引用并且獲取受管理的“clinic”BEAN:

清單4

WebApplicationContext ctx = 
   WebApplicationContexUtils.getWebApplicationContext(servletContext);
Clinic clinic = (Clinic) ctx.getBean("clinic);
Pet pet = new Pet();
pet.setName("my new cat");
clinic.storePet(pet);

在調(diào)用storePet()之前,Spring的事務(wù)代理隱式地創(chuàng)建一個(gè)事務(wù)。當(dāng)storePet()調(diào)用返回時(shí),事務(wù)將提交或回滾。缺省情況下任何RuntimeException或Error將導(dǎo)致回滾。實(shí)際的提交或回滾可以是可以定義的:Spring的事務(wù)屬性支持“回滾規(guī)則”的概念。

例如,我們可以可以引入一個(gè)強(qiáng)制的PetClinicException并且告訴事務(wù)代理在拋出異常時(shí)回滾:

清單5

<prop key="load*">PROPAGATION_REQUIRED,readOnly,-PetClinicException</prop>
<prop key="store*">PROPAGATION_REQUIRED,-PetClinicException</prop>

這兒也有一個(gè)類似的“提交規(guī)則”語(yǔ)法,指示特定的異常將觸發(fā)一次提交。
注意上面示例的顯式定位引用的方法只是一種訪問(wèn)受Spring管理BEAN的方法的變化,可以用在任何WEB資源如servlet或filter。在構(gòu)建基于Spring自身的MVC框架時(shí),BEAN可以直接被注射到WEB控制器中。當(dāng)然也支持在如Struts, WebWork, JSF, and Tapestry框架中訪問(wèn)Spring管理BEAN。詳情可以參考Spring的文檔。

PlatformTransactionManager策略

Spring事務(wù)支持的核心接口是org.springframework.transaction.PlatformTransactionManager。所有Spring的事務(wù)分離功能都會(huì)委托給PlatformTransactionManager(傳給相應(yīng)的TransactionDefinition實(shí)例)來(lái)做實(shí)際的事務(wù)執(zhí)行。雖然PlatformTransactionManager接口可以直接調(diào)用,但通常應(yīng)用只需要配置一個(gè)具體的事務(wù)管理器并且通過(guò)聲明性事務(wù)來(lái)分離事務(wù)。

Spring提供幾種不同的PlatformTransactionManager實(shí)現(xiàn),分為如下兩個(gè)類別:

  1. 本地事務(wù)策略—支持單一資源的事務(wù)(通常是單個(gè)數(shù)據(jù)庫(kù)),其包括org.springframework.jdbc.datasource.DataSourceTransactionManagerorg.springframework.orm.hibernate.HibernateTransactionManager。
  2. 全局事務(wù)管理—支持可能跨越多個(gè)資源的全局事務(wù)。其相應(yīng)的類為org.springframework.transaction.jta.JtaTransactionManager,將事務(wù)委托給遵循JTA規(guī)范的事務(wù)協(xié)調(diào)器(通常為J2EE服務(wù)器,但不是強(qiáng)制的)。

PlatformTransactionManager抽象的主要價(jià)值在于應(yīng)用不再被綁定在特定的事務(wù)管理環(huán)境。相反,事務(wù)策略可以很容易地切換—通過(guò)選擇不同的PlatformTransactionManager實(shí)現(xiàn)類。這就使得應(yīng)用代碼與聲明事務(wù)分離保持一致,而不需要考慮應(yīng)用組件所使用的環(huán)境了。

例如,應(yīng)用的初始版本可能布署在Tomcat上,與單個(gè)Oracle數(shù)據(jù)庫(kù)交互。這可以方便地利用Spring的事務(wù)分離特性,只要選擇基于JDBC的DataSourceTransactionManager作為使用的事務(wù)策略。Spring會(huì)分離事務(wù),而JDBC驅(qū)動(dòng)會(huì)執(zhí)行相應(yīng)的原始JDBC事務(wù)。

相同應(yīng)用的另一個(gè)版本可能會(huì)布署在WebLogic服務(wù)器上,使用兩個(gè)Oracle數(shù)據(jù)庫(kù)。應(yīng)用代碼和事務(wù)分離不需要改變。唯一不同的是選擇作為JtaTransactionManager事務(wù)策略,讓Spring來(lái)分離事務(wù)而WebLogic服務(wù)器的事務(wù)協(xié)調(diào)器來(lái)執(zhí)行事務(wù)。

JTA UserTransaction與JTA TransactionManager比較

讓我們來(lái)看一下Spring對(duì)JTA支持的細(xì)節(jié)。雖然并非經(jīng)常需要考慮這個(gè)細(xì)節(jié)但了解相關(guān)的細(xì)節(jié)還有必要的。對(duì)簡(jiǎn)單的用例如前面章節(jié)的示例,標(biāo)準(zhǔn)的JtaTransactionManager定義已經(jīng)足夠了,缺省的Spring JtaTransactionManager設(shè)置會(huì)從標(biāo)準(zhǔn)JNDI位置(J2EE規(guī)范所定義的java:comp/UserTransaction)獲取JTA的javax.transaction.UserTransaction對(duì)象。這對(duì)大部分標(biāo)準(zhǔn)J2EE環(huán)境來(lái)說(shuō)已經(jīng)足夠了。

然而,缺省的JtaTransactionManager不能執(zhí)行事務(wù)暫停(也就是說(shuō)不支持PROPAGATION_REQUIRES_NEW和PROPAGATION_NOT_SUPPORTED)。原因就在于標(biāo)準(zhǔn)的JTA UserTransaction接口不支持事務(wù)的暫停和恢復(fù),而只支持開始和完成新的事務(wù)。

為了實(shí)現(xiàn)事務(wù)的暫停,需要一個(gè)javax.transaction.TransactionManager實(shí)例,他提供了JTA定義的標(biāo)準(zhǔn)的暫停和恢復(fù)方法。不幸的是,J2EE沒(méi)有為JTA TransactionManager定義標(biāo)準(zhǔn)的JNDI位置!因此,我們需要使用廠商自己的定位機(jī)制。

清單6

<bean id="transactionManager" 
   class="org.springframework.transaction.jta.JtaTransactionManager">
     <property name="transactionManagerName">
        <value>vendorSpecificJndiLocation</value>
     </property>
</bean>

J2EE本質(zhì)上沒(méi)有考慮將JTA TransactionManager接口作為公共API的一部分。JTA規(guī)范自身定義了將TransactionManager接口作為容器集成的想法。雖然這是可以理解的,但是JTA TransactionManager的標(biāo)準(zhǔn)JNDI位置還是可以增加一定的價(jià)值,特別是對(duì)輕量級(jí)容器如Spring,這樣任何J2EE服務(wù)器就可以用統(tǒng)一的方式來(lái)定位JTA TransactionManager了。

不僅Spring的JtaTransactionManager可以從訪問(wèn)中獲益,O/R映射工具如Hibernate, Apache OJB, and Kodo JDO也能得到好處,因?yàn)樗麄冃枰贘TA環(huán)境中執(zhí)行緩存同步的能力(釋放緩存意味著JTA事務(wù)的完成)。這種注冊(cè)事務(wù)同步的能力只有JTA TransactionManager接口才能提供,而UserTransaction是處理不了的。因此,這些工具都需要實(shí)現(xiàn)自己的TransactionManager定位器。

為JTA TransactionManager定義標(biāo)準(zhǔn)的JNDI位置是許多底層軟件供應(yīng)商最期望J2EE實(shí)現(xiàn)的功能。如果J2EE5.0的規(guī)范制定團(tuán)隊(duì)能夠認(rèn)識(shí)到這個(gè)特性的重要性就太好了。幸運(yùn)地是,高級(jí)J2EE服務(wù)器如WebLogic Server已經(jīng)考慮將JTA TransactionManager作為公共的API包含在擴(kuò)展功能中。

在WebLogic JTA中實(shí)現(xiàn)Spring的事務(wù)分離

在WebLogic Server中,JTA TransactionManager官方的JNDI位置定義為javax.transaction.TransactionManager。這個(gè)值可以在Spring的JtaTransactionManager中作為“transactionManagerName”使用。原則上這樣就可以在WebLogic's JTA系統(tǒng)中實(shí)現(xiàn)事務(wù)暫停了,也就是說(shuō)支持PROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTED行為。

除了標(biāo)準(zhǔn)的JtaTransactionManager和其支持的通用配置選項(xiàng)外,Spring還提供了一個(gè)專用的WebLogicJtaTransactionManager適配器來(lái)直接利用WebLogic的JTA擴(kuò)展。

在享受自動(dòng)探測(cè)WebLogic的JTA TransactionManager的便利之外,他提供超越標(biāo)準(zhǔn)JTA的三個(gè)重要特性:

  1. 事務(wù)命名—暴露出Spring的事務(wù)名給WebLogic Server,使得Spring事務(wù)在WebLogic的事務(wù)監(jiān)聽器可見(jiàn)。缺省的,Spring會(huì)使用聲明性事務(wù)的完整方法名。
  2. 每事務(wù)隔離級(jí)別—將Spring事務(wù)屬性中定義的隔離級(jí)別應(yīng)用到WebLogic JTA事務(wù)中。這使得每個(gè)事務(wù)都可以定義數(shù)據(jù)庫(kù)的隔離級(jí)別,而這是標(biāo)準(zhǔn)JTA所不支持的。
  3. 強(qiáng)制事務(wù)恢復(fù)—即使在暫停的事務(wù)被標(biāo)識(shí)為回滾時(shí)也可以恢復(fù)。這需要使用WebLogic的擴(kuò)展TransactionManager接口來(lái)調(diào)用forceResume()方法。

Figure 2. WebLogic Server's transaction monitor (click the image for a full-size screen shot)

Spring的WebLogicJtaTransactionManager有效地為基于Spring的應(yīng)用提供了WebLogic Server事務(wù)管理的全部功能。這使得Spring事務(wù)分離成為一種能與EJB CMT竟?fàn)幍漠a(chǎn)品,而且提供了相同級(jí)別的事務(wù)支持。

Spring and EJB CMT

如上所示,Spring的POJO聲明性事務(wù)分離可以作為一種除傳統(tǒng)EJB CMT這外的選擇。但是Spring與EJB并不是完成互斥的,Spring的應(yīng)用上下文也可以作為EJB fa?ade的后臺(tái)來(lái)管理數(shù)據(jù)訪問(wèn)(DAO)和其他細(xì)紋理的業(yè)務(wù)對(duì)象。

在EJB情景中,事務(wù)是由EJB CMT來(lái)驅(qū)動(dòng)的。對(duì)Spring來(lái)說(shuō),數(shù)據(jù)訪問(wèn)支持特性會(huì)自動(dòng)檢測(cè)到這樣的環(huán)境并且采用相應(yīng)的事務(wù)。例如,Spring對(duì)Hibernate的支持能夠提供隱式的資源管理,即使是EJB驅(qū)動(dòng)的事務(wù),甚至可以在不需要修改任何DAO代碼的情況下提供相同的語(yǔ)義。
Spring有效的解耦了DAO實(shí)現(xiàn)與實(shí)際的運(yùn)行環(huán)境。DAO可以參與Spring的事務(wù)就像參與EJB CMT事務(wù)一樣。這不僅簡(jiǎn)化在其他環(huán)境中的重用,而且更方便在J2EE容器外進(jìn)行測(cè)試。

結(jié)論

Spring框架為J2EE和非J2EE環(huán)境提供了全量的事務(wù)分離的特性,特別表現(xiàn)在POJO的聲明性事務(wù)上。他用一種靈活而非侵入式的方式為非EJB環(huán)境中的事務(wù)分離提供了便利。與EJB不同,這樣的事務(wù)性POJO應(yīng)用對(duì)象可以很容易的被測(cè)試和在J2EE容器外補(bǔ)重用。

Spring提供了各種事務(wù)策略,如JtaTransactionManager是用來(lái)代理J2EE服務(wù)器的事務(wù)協(xié)調(diào)器,而JDBC DataSourceTransactionManager是用來(lái)為簡(jiǎn)單的JDBC DataSource(就是單一目標(biāo)數(shù)據(jù)庫(kù))執(zhí)行事務(wù)。Spring可以很容易為不同的環(huán)境通過(guò)后臺(tái)配置的簡(jiǎn)單修改來(lái)調(diào)整事務(wù)策略。

超越標(biāo)準(zhǔn)的JTA支持,Spring為WebLogic Server的JTA擴(kuò)展提供了完善的集成,可以支持高級(jí)特性如事務(wù)監(jiān)視和每事務(wù)隔離級(jí)別。通過(guò)對(duì)WebLogic Server的特殊支持,基于Spring的應(yīng)用可以完全利用WebLogic Server的事務(wù)管理功能。

Spring事務(wù)分離是繼EJB CMT之外的另一種可選方式,特別是對(duì)那些基于POJO的輕量級(jí)架構(gòu)。在那只是因?yàn)檫x擇LSSB(本地?zé)o狀態(tài)會(huì)話BEAN)來(lái)應(yīng)用聲明性事務(wù)的情況下,基于Spring的POJO服務(wù)模型是一種可行的選擇,他提供了非常高層的靈活性、可測(cè)試性和重用性。

Java高級(jí)架構(gòu)獅:專注于Java開發(fā)技術(shù)的研究與知識(shí)分享!
————END————

  • 點(diǎn)贊(感謝)
  • ...
  • 轉(zhuǎn)發(fā)(感謝)
  • ...
  • 關(guān)注(感謝)
  • ...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 5.Spring的事務(wù) 通常情況下,J2EE有2種事務(wù)管理方式:全局事務(wù)和本地事務(wù),2種事務(wù)都比較明顯的缺陷。 全...
    FTOLsXD閱讀 1,578評(píng)論 0 8
  • 這部分的參考文檔涉及數(shù)據(jù)訪問(wèn)和數(shù)據(jù)訪問(wèn)層和業(yè)務(wù)或服務(wù)層之間的交互。 Spring的綜合事務(wù)管理支持覆蓋很多細(xì)節(jié),然...
    竹天亮閱讀 1,100評(píng)論 0 0
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,012評(píng)論 0 11
  • Spring 事務(wù)屬性分析 事務(wù)管理對(duì)于企業(yè)應(yīng)用而言至關(guān)重要。它保證了用戶的每一次操作都是可靠的,即便出現(xiàn)了異常的...
    壹點(diǎn)零閱讀 1,381評(píng)論 0 2
  • 什么是事務(wù)? 事務(wù)(Transaction),一般是指要做的或所做的事情。在計(jì)算機(jī)術(shù)語(yǔ)中是指訪問(wèn)并可能更新數(shù)據(jù)庫(kù)中...
    青青子衿zq閱讀 8,203評(píng)論 0 2

友情鏈接更多精彩內(nèi)容