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

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

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

    一杯清茶

    統(tǒng)計(jì)

    留言簿

    Oracle SQL/PLSQL

    PowerDesigner教程系列

    Struts2.0

    web開發(fā)

    三人行

    從事RCP開發(fā)的同行

    工作流和權(quán)限設(shè)置

    閱讀排行榜

    評(píng)論排行榜

    Spring in Action 學(xué)習(xí)筆記—第五章 事務(wù)管理

    轉(zhuǎn)自:http://www.tkk7.com/msmary/articles/155398.html

    本章是第四章的延續(xù),作者向讀者展示了如何使用Spring事務(wù)管理來保證數(shù)據(jù)一致性。Spring對(duì)事務(wù)的管理有豐富的支持,程序控制的和聲明式的都有。在本章中,我們會(huì)學(xué)習(xí)到如何把應(yīng)用程序的代碼放置在事務(wù)中,以確保在一切順利時(shí),所有的成果都被固定下來;一旦其中有一步出錯(cuò),那么整個(gè)事情就像沒有發(fā)生一樣。

     

    一、理解事務(wù)

    首先我們應(yīng)該弄清楚什么是事務(wù),這樣才能認(rèn)識(shí)到事務(wù)的重要性。舉一個(gè)小小的例子,大概每個(gè)人都有轉(zhuǎn)賬的經(jīng)歷。當(dāng)我們從A帳戶向B帳戶轉(zhuǎn)100元后,銀行的系統(tǒng)會(huì)從A帳戶上扣除100而在B帳戶上加100,這是一般的正常現(xiàn)象。但是一旦系統(tǒng)出錯(cuò)了怎么辦呢,這里我們假設(shè)可能會(huì)發(fā)生兩種情況:(1A帳戶上少了100元,但是B帳戶卻沒有多100元。(2B帳戶多了100元錢,但是A帳戶上卻沒有被扣錢。這種錯(cuò)誤一旦發(fā)生就等于出了大事,那么再假如一下,你要轉(zhuǎn)賬的是1億呢?所以上面的兩種情況分別是你和銀行不愿意看到的,因?yàn)檎l都不希望出錯(cuò)。那么有沒有什么方法保證一旦A帳戶上沒有被扣錢而B帳戶上也沒有被加錢;或者A帳戶扣了100元而B帳戶準(zhǔn)確無誤的加上100元呢。也就是說要么轉(zhuǎn)賬順利的成功進(jìn)行,要么不轉(zhuǎn)賬呢?可以,這就是數(shù)據(jù)庫事務(wù)機(jī)制所要起到的作用和做的事情。

    下面給出事務(wù)的概念(在數(shù)據(jù)庫中事務(wù)的概念在表述上略有差異,但是含義都是一樣的):

    所謂事務(wù)是用戶定義的一個(gè)數(shù)據(jù)庫操作序列。這些操作要么都做,要么都不做,是一個(gè)不可分割的工作單位。事務(wù)具有四個(gè)特性:

    1.         原子性:一個(gè)事務(wù)中所有對(duì)數(shù)據(jù)庫的操作是一個(gè)不可分割的操作序列。這些操作要么完整的被全部執(zhí)行,要么一步也不做。是一個(gè)邏輯工作單位。

    2.         一致性:一個(gè)事務(wù)獨(dú)立執(zhí)行的結(jié)果將保持一致性,即數(shù)據(jù)不會(huì)因?yàn)槭聞?wù)的執(zhí)行而遭受破壞。

    3.         隔離性:一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其他并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。

    4.         持久性:一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對(duì)其執(zhí)行結(jié)果有任何影響。

    結(jié)合前面的例子解釋一下概念:在轉(zhuǎn)賬示例中A100元錢和B100元錢這兩步更新操作就是一個(gè)操作序列。這兩步是一個(gè)整體要么全部成功,要么全部成功,絕對(duì)不能只成功一步而另一步失敗。關(guān)于數(shù)據(jù)庫事務(wù)的詳細(xì)知識(shí)請(qǐng)參考有關(guān)的數(shù)據(jù)庫原理書籍。

    Spring框架引人注目的重要因素之一是它全面的事務(wù)支持。Spring支持編程式事務(wù)聲明式事務(wù)

     

    二、在Spring中編寫事務(wù)

    在我們的代碼中添加事務(wù)的一種方法就是使用SpringTransactionTemplate類,用程序添加事務(wù)邊界。就像其他Spring的模版類一樣,TransactionTemplate利用一套回調(diào)機(jī)制,把我們的代碼包裝在一個(gè)TransactionTemplate里。看下面的代碼片斷:

           publicvoid enrollStudentInCourse()

           {

                  tran.execute(new TransactionCallback()

                  {

                         public Object doInTransaction(TransactionStatus ts){

                                try{

                                       //do something....

                                }catch(Exception ex){

                                       ts.setRollbackOnly();//出錯(cuò)進(jìn)行事務(wù)回滾

                                }

                                returnnull;

                         }

                  }

                  );

           }

    下面是配置文件:

    <bean id = "transactionTemplate" class = "org.springframework.transaction.support.TransactionTemplate">

           <property name="transactionManager"><ref bean = "transactionTemplate"/></property>

    </bean>

     

    <bean id = "courseService" class = "MyImp">

           <property name="transactionTemplate"><ref bean = "transactionTemplate"/></property>

    </bean>

    transactionTemplate對(duì)象有一個(gè)transactionManager屬性。該屬性為PlatformTransactionManager類型,它用來處理特定平臺(tái)的事務(wù)管理的細(xì)節(jié)。也可以直接使用 org.springframework.transaction.PlatformTransactionManager的實(shí)現(xiàn)來管理事務(wù)。只需通過bean引用簡單地傳入一個(gè) PlatformTransactionManager實(shí)現(xiàn),然后使用 TransactionDefinition TransactionStatus對(duì)象,你就可以啟動(dòng)一個(gè)事務(wù),提交或回滾。在上例的簡單代碼中我們展示的是編程式事務(wù)當(dāng)你完全希望控制事務(wù)的邊界時(shí)候,編程式事務(wù)是不錯(cuò)的。但是他有些侵入性。通常我們的事務(wù)需求并沒有要求在事務(wù)的邊界上進(jìn)行如此精確的控制。我們可以使用聲明式事務(wù)

     

    三、聲明式事務(wù)

    大多數(shù)Spring用戶選擇聲明式事務(wù)管理。這是對(duì)應(yīng)用代碼影響最小的選擇,因此也最符合非侵入式輕量級(jí)容器的理念。Spring的聲明式事務(wù)管理是通過Spring AOP實(shí)現(xiàn)的,因?yàn)槭聞?wù)方面的代碼與Spring綁定并以一種樣板式風(fēng)格使用,這樣做是非常自然的,因?yàn)槭聞?wù)時(shí)系統(tǒng)級(jí)的,凌駕于應(yīng)用的主要功能之上的,你可以把Spring的事務(wù)想象成是一個(gè)切面(方面)包裹著一個(gè)方法。不過盡管如此,你一般并不需要理解AOP概念就可以有效地使用Spirng的聲明式事務(wù)管理。

    Spring2.0之前要在Spring中使用聲明式事務(wù),得用TransactionProxyFactoryBean。這是一個(gè)接口,他有點(diǎn)類似在第三章中的ProxyFactoryBean,只不過它的目的是將方法包裝在事務(wù)的上下文中。Spring2.0及以后的版本中聲明式事務(wù)的配置與之前的版本有相當(dāng)大的不同。主要差異在于不再需要配置TransactionProxyFactoryBean了。Spring2.0之前的舊版本風(fēng)格的配置仍然是有效的;你可以簡單地認(rèn)為新的<tx:tags/>替你定義了TransactionProxyFactoryBean。和TransactionProxyFactoryBean配合的還有兩個(gè),一個(gè)是PlatformTransactionManager另一個(gè)是TransactionAttributeSource

    1.理解事務(wù)屬性:

    Spring里,事務(wù)屬性是對(duì)事務(wù)策略如何應(yīng)用到方法的描述。這個(gè)描述包括下列一些參數(shù):傳播行為、隔離級(jí)別、只讀提示、事務(wù)超時(shí)間隔。

    (1)傳播行為

    傳播行為定義了關(guān)于客戶端和被調(diào)用方法的事務(wù)邊界。Spring定義了7種截然不同的傳播行為。(在書中165頁有詳細(xì)列表)Spring的傳播行為分別對(duì)應(yīng)了EJB容器管理的事務(wù)(CMT)中所有的傳播規(guī)則。傳播規(guī)則回答了一個(gè)問題,就是新的事務(wù)是否要被啟動(dòng)或是被掛起,或者方法是否要在事務(wù)環(huán)境中運(yùn)行。

    2)隔離級(jí)別

    在一個(gè)典型的應(yīng)用中,多個(gè)事務(wù)并發(fā)運(yùn)行,經(jīng)常會(huì)操作同一個(gè)數(shù)據(jù)來完成任務(wù)。并發(fā)會(huì)導(dǎo)致以下問題:

    l         臟讀——臟讀發(fā)生在一個(gè)事務(wù)讀取了被另一個(gè)事務(wù)改寫但還未提交的數(shù)據(jù)時(shí)。

    l         不可重復(fù)讀——不可重復(fù)讀發(fā)生在一個(gè)事務(wù)執(zhí)行相同的查詢兩次或兩次以上,但每一次查詢結(jié)果不同時(shí)。

    l         幻讀——幻讀和不可重復(fù)讀相似。

    在理想狀態(tài)下,事務(wù)要完全相互隔離,以防止這些問題發(fā)生。(這些內(nèi)容在數(shù)據(jù)庫原理里面都有講解,大家可以參考數(shù)據(jù)庫原理的相關(guān)書)然而完全隔離會(huì)影響性能,因?yàn)楦綦x經(jīng)常牽扯到鎖定在數(shù)據(jù)庫中的記錄。侵占性的鎖定會(huì)阻礙并發(fā),要求事務(wù)相互等待來完成工作,這樣會(huì)引起事務(wù)死鎖

    應(yīng)該認(rèn)識(shí)到完全隔離會(huì)影響性能,并且不是所有應(yīng)用都需要完全隔離,有時(shí)候應(yīng)用需要在事務(wù)隔離上有些彈性。因此也有好幾個(gè)隔離級(jí)別,見書166頁下面的表格。

    3)只讀

    如果一個(gè)事務(wù)只對(duì)后段數(shù)據(jù)庫執(zhí)行讀操作,數(shù)據(jù)庫就可能利用事務(wù)只讀的特性,使用某些優(yōu)化措施。通過聲明一個(gè)事務(wù)為只讀,你就給了后端數(shù)據(jù)庫一個(gè)機(jī)會(huì),來應(yīng)用那些它認(rèn)為合適的優(yōu)化措施。

    4)事務(wù)超時(shí)

        在事務(wù)中你可能選擇設(shè)置的另一個(gè)屬性就是超時(shí)。假設(shè)你的事務(wù)在預(yù)料之外長時(shí)間運(yùn)行,因?yàn)槭聞?wù)可能涉及對(duì)后端數(shù)據(jù)庫的鎖定,長時(shí)間運(yùn)行的事務(wù)會(huì)不必要的占用數(shù)據(jù)庫資源。與其等他結(jié)束,不如聲明一個(gè)事務(wù),在特定秒數(shù)后自動(dòng)回滾。

     

    四、通過方法名聲明事務(wù)

    NameMatchTransactionAttributeSource,這個(gè)事務(wù)屬性源讓你在方法名的基礎(chǔ)上聲明事務(wù)屬性。看下面的例子:

           <bean id = "transactionAttuibuteSource" class = "org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">

                  <property name="properties">

                         <props>

                                <prop key="enrollStudentInCourse">

                                       PROPAGATION_REQUIRES_NEW

                                </prop>

                         </props>

                  </property>

           </bean>

    被命名為transactionAttuibuteSourcebean 將被置入到TransactionProxyFactoryBeantransactionAttuibuteSource屬性中。

    NameMatchTransactionAttributeSourceproperties屬性把方法名映射到事務(wù)屬性描述器上。事務(wù)屬性描述器有以下幾種形式:

    l         PROPAGATION——傳播行為

    l         ISOLATION——隔離級(jí)別(可選)

    l         Readonly——是只讀事務(wù)嗎?(可選)

    l         -Exeptions——回滾規(guī)則(可選)

    l         +Exception——同上

    在上面的例子中,只指定了傳播行為。但是,事務(wù)的許多其他參數(shù)都可以在事務(wù)屬性描述器中定義。

        指定事務(wù)隔離級(jí)別

           <bean id = "transactionAttuibuteSource" class = "org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">

                  <property name="properties">

                         <props>

                                <prop key="enrollStudentInCourse">

                                       PROPAGATION_REQUIRES_NEW, ISOLATION_REPEATABLE_READ

                                </prop>

                         </props>

                  </property>

           </bean>

        使用只讀事務(wù)

           <bean id = "transactionAttuibuteSource" class = "org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">

                  <property name="properties">

                         <props>

                                <prop key="enrollStudentInCourse">

                                       PROPAGATION_REQUIRES_NEW, ISOLATION_REPEATABLE_READ, readOnly

                                </prop>

                         </props>

                  </property>

           </bean>

        指定回滾規(guī)則

        當(dāng)事務(wù)運(yùn)行過程中拋出異常時(shí),事務(wù)可以被聲明為回滾或者不回滾。默認(rèn)情況下,發(fā)生運(yùn)行時(shí)間異常時(shí),事務(wù)將被回滾;發(fā)生受查異常(checked exception)時(shí),不回滾。

           <bean id = "transactionAttuibuteSource" class = "org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">

                  <property name="properties">

                         <props>

                                <prop key="enrollStudentInCourse">

                                       PROPAGATION_REQUIRES_NEW, ISOLATION_REPEATABLE_READ, -CourseException

                                </prop>

                         </props>

                  </property>

           </bean>

        CourseException用一個(gè)負(fù)號(hào)(-)標(biāo)記。異常可以用負(fù)號(hào)(-)或者正號(hào)(+)標(biāo)記,當(dāng)負(fù)號(hào)異常拋出時(shí),將觸發(fā)回滾;相反的,正號(hào)異常表示事務(wù)仍可提交,即使這個(gè)異常拋出。你甚至可以把運(yùn)行時(shí)間異常標(biāo)記為正號(hào),以防止回滾。

        使用通配符匹配

    <bean id = "transactionAttuibuteSource" class = "org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">

                  <property name="properties">

                         <props>

                                <prop key="get*">

                                       PROPAGATION_SUPPORTS

                                </prop>

                         </props>

                  </property>

           </bean>

     

    五、用元數(shù)據(jù)聲明事務(wù)

        就元數(shù)據(jù)而言,他們不直接改變你的代碼行為。反之,他們給應(yīng)用的支撐平臺(tái)提供提示和建議,指導(dǎo)平臺(tái)如何才能把附加行為運(yùn)用到應(yīng)用中。用元數(shù)據(jù)來表現(xiàn)事務(wù)屬性是最自然不過的了。正如你所看到的,事物屬性不直接改變方法的執(zhí)行,但當(dāng)一個(gè)方法被TransactionProxyFactoryBean代理時(shí),它將被包裹在一個(gè)事務(wù)中。

    1.用元數(shù)據(jù)來書寫事務(wù)屬性

        為了讓TransactionProxyFactoryBean能夠從元數(shù)據(jù)檢索事務(wù)屬性,需要將他的transactionAttributeSource設(shè)置成AttributesTransactionAttributeSource,如下所示:

    <bean id = "transactionAttributeSource" class = "org.springframework.transaction.interceptor.AttributesTransactionAttributeSource">

                  <constructor-arg>

                         <ref bean = "attributesImpl"/>

                  </constructor-arg>

           </bean>

        在這個(gè)事務(wù)屬性源的構(gòu)造參數(shù)中置入了一個(gè)名為attributesImpl的對(duì)象的引用。這個(gè)attributesImpl對(duì)象將被事務(wù)屬性源使用,和底層的元數(shù)據(jù)實(shí)現(xiàn)配合。

    2.用Commons Attributes聲明事務(wù)

        Jakarta Commons Attributes是最早在Java中實(shí)現(xiàn)元數(shù)據(jù)的方法之一。Commons Attributes的好處就在于不需要跳到Java 5才能使用元數(shù)據(jù)。這樣如果你仍然部署在一個(gè)比較老的Java版本,并且想用元數(shù)據(jù)聲明事務(wù)的話,唯一的選擇就是使用Commons Attributes。然而,現(xiàn)在Java 6已經(jīng)快出來了。Java 5已經(jīng)可以說得到普遍應(yīng)用了,尤其是在我們公司以及我個(gè)人都已經(jīng)遷移到Java 5平臺(tái)上了。所以,運(yùn)用Commons Attributes聲明事務(wù)這里就不多摘錄了。

     

    六、修剪事務(wù)聲明

    Spring提供兩種方法抗擊繁復(fù)的XML

    l         Bena繼承

    l         AOP自動(dòng)代理

    1.從父TransactionProxyFactoryBean繼承

    簡化事務(wù)和服務(wù)對(duì)象聲明的一種方法是使用Spring對(duì)父bean的支持。使用<bean>標(biāo)簽的parent屬性,就能夠指定一個(gè)bean成為其他bean的孩子,繼承父bean的屬性。

    使用bean繼承來縮減包含多重TransactionProxyFactoryBean聲明的XML,開始于在上下文定義中添加一個(gè)TransactionProxyFactoryBeanabstract聲明:

           <bean id = "abstractTxDefinition" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true">

                  <property name="transactionManager">

                         <ref bean="transactionManager"/>

                  </property>

                  <property name="transactionAttributeSource">

                  <ref bean="attributeSource"/>

                  </property>

           </bean>

    這個(gè)聲明類似于前面的courseService聲明,除了這兩件事情:

    l         首先,它的lazy-init屬性是設(shè)置為true的。應(yīng)用上下文通常在啟動(dòng)的時(shí)候?qū)嵗?/span>singleton bean。既然我們的應(yīng)用僅僅使用abstractTxDefinition的子bean,而不會(huì)直接使用abstractTxDefinition,那么我們就不希望容器去初始化一個(gè)我們從來不用的beanLazy-init屬性告訴容器不要?jiǎng)?chuàng)建bean,除非我們請(qǐng)求。實(shí)際上lazy-init就是把這個(gè)bean變成抽象的。

    l         Traget屬性奇怪的消失了。

        下面創(chuàng)建子bean

           <bean id = "courseService" parent = "abstractTxDefinition">

                  <property name="target">

                         <bean class = "myImpl">

                  </property>

           </bean>

    Parent屬性表示這個(gè)bean將從abstractTxDefinition bean中繼承他的定義。這個(gè)bean所要添加的一件事情就是綁定一個(gè)target屬性的值。

    到目前為止,這個(gè)技術(shù)并沒有讓我們節(jié)省更多的XML,但是考慮到你將要做的事情是讓另一個(gè)bean事務(wù)化,你只需要加另一個(gè)abstractTxDefinition的子bean就可以了。

           <bean id = "studentService" parent = "abstractTxDefinition">

                  <property name="target">

                         <bean class = "myImpl">

                  </property>

           </bean>

    但是,請(qǐng)注意你并不用再完整的定義另外一個(gè)TransactionProxyFactoryBean。現(xiàn)在想象一下,假如你的應(yīng)用有幾十個(gè)服務(wù)bean需要被事務(wù)化。當(dāng)我們有大量需要被事務(wù)化的bean時(shí),bean的繼承就真正得到回報(bào)了。

    2.自動(dòng)代理事務(wù)

        Spring中事務(wù)是基于AOP的,同樣可以用自動(dòng)代理來除掉TransactionProxyFactoryBean的重復(fù)實(shí)例。

        首先,就像要做任何自動(dòng)通知(auto-advising)一樣,你需要聲明一個(gè)bean,成為DefaultAopProxyFactory的實(shí)例:

           <bean id = "autoproxy" class = "org.springframework.aop.framework.DefaultAopProxyFactory">

                  ....

           </bean>

    DefaultAopProxyFactory將在應(yīng)用上下文中遍歷advisor,自動(dòng)用它來代理匹配advisorpointcut的所有bean。對(duì)于事務(wù),應(yīng)該使用的advisorTransactionAttributeSourceAdvisor:

           <bean id="transactionAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">

                  <constructor-arg>

                         <ref bean = "transactionInterceptor"/>

                  </constructor-arg>

           </bean>

    TransactionAttributeSourceAdvisor是一個(gè)羽翼豐滿的AOP advisor,和任何advisor一樣,它由一個(gè)pointcut和一個(gè)攔截器組成。這個(gè)pointcut是一個(gè)staticpointcut。他根據(jù)事務(wù)屬性源來確定一個(gè)方法是否和一些事務(wù)屬性關(guān)聯(lián)。如果一個(gè)方法有事務(wù)屬性,那么這個(gè)方法將被代理并包含在一個(gè)事務(wù)中。

        關(guān)于攔截器,它通過一個(gè)構(gòu)造參數(shù)置入到TransactionAttributeSourceAdvisor。他由TransactionInterceptor類實(shí)現(xiàn)并像下面那樣被置入到應(yīng)用中:

           <bean id = "transactionInterceptor" class = "org.springframework.transaction.interceptor.TransactionInterceptor">

                  <property name="transactionManager">

                         <ref bean = "transactionManager"/>

                  </property>

                  <property name="transactionAttributeSource">

                         <ref bean = "transactionAttributeSource"/>

                  </property>

           </bean>

    TransactionInterceptor有兩個(gè)用來完成工作的合作者。他使用PlatformTransactionMananager,并將他置入到transactionManager屬性,是事物和他背后的事務(wù)實(shí)現(xiàn)相配合。同時(shí),他使用被置入到transactionAttributeSource屬性的事務(wù)實(shí)現(xiàn)源來確定它將攔截的應(yīng)用刀這個(gè)方法的事務(wù)策略。事實(shí)上,當(dāng)在使用TransactionProxyFactoryBean時(shí)早已定義好了transactionManagertransactionAttributeSource bean——它們也將很好地為事務(wù)攔截器工作。

        最后一件要做的事情就是刪除所有TransactionProxyFactoryBean的實(shí)例,并把服務(wù)bean重命名回它們?cè)瓉碚_的名稱。

    為自動(dòng)代理選擇一個(gè)屬性源

           當(dāng)使用自動(dòng)代理事務(wù)時(shí),事務(wù)屬性源是一個(gè)方法是否需要代理的關(guān)鍵。這個(gè)事務(wù)可能會(huì)提示你選擇不同的事務(wù)屬性源。

           當(dāng)使用自動(dòng)代理時(shí),對(duì)于事務(wù)屬性源的一個(gè)更好的選擇是MethodMapTransactionAttributeSorrce。這個(gè)事務(wù)屬性源類似于NameMatchTransactionAttributeSource,但他讓你指定需要事務(wù)化的完整類名稱和方法名。

        當(dāng)用自動(dòng)代理時(shí),事務(wù)屬性源的一個(gè)更好的選擇是TransactionAttributeSourceAdvisor。回憶一下,AttributeTransactionAttributeSourceAdvisor把事務(wù)屬性從元數(shù)據(jù)中取出來,而這些元數(shù)據(jù)是直接放在要事務(wù)化的方法的代碼中的。這就意味著,如果你使用AttributeTransactionAttributeSourceAdvisor作為屬性源,并同時(shí)使用自動(dòng)代理的話,使方法事務(wù)化,只不過是添加合適的元數(shù)據(jù)到方法里而已。

     

    七、小結(jié)

           事務(wù)是企業(yè)應(yīng)用開發(fā)的重要組成部分,他使軟件更加可靠。它們確保一種要么全有要么全無的行為,防止數(shù)據(jù)不一致而導(dǎo)致的不可預(yù)測(cè)的錯(cuò)誤發(fā)生。它們同時(shí)也支持并發(fā),防止并發(fā)應(yīng)用線程在操作同一數(shù)據(jù)時(shí)互相影響。

           關(guān)于Spring事務(wù)的詳細(xì)內(nèi)容,在Spring2.0文檔中做了詳細(xì)的講解。并且在Spring2.0中有了許多改動(dòng)。

    posted on 2010-04-27 14:24 一杯清茶 閱讀(811) 評(píng)論(0)  編輯  收藏 所屬分類: Spring

    主站蜘蛛池模板: 国产亚洲精品仙踪林在线播放| 亚洲国产综合人成综合网站00| 国产亚洲综合色就色| 久久久久亚洲Av无码专| 亚洲国产熟亚洲女视频| 色吊丝免费观看网站| 自拍偷自拍亚洲精品第1页| 亚洲av无码乱码国产精品fc2| 亚洲免费人成视频观看| 国产成人+综合亚洲+天堂| 中国精品一级毛片免费播放| 18级成人毛片免费观看| 全黄a免费一级毛片人人爱| 国产l精品国产亚洲区在线观看| 亚洲无限乱码一二三四区| 最新亚洲人成无码网www电影| 中文字幕无线码免费人妻| 免费看片在线观看| 日本成人免费在线| 亚洲精品你懂的在线观看| 亚洲欧洲另类春色校园网站| 曰批免费视频播放免费| 最刺激黄a大片免费网站| 国产真人无遮挡作爱免费视频| 久久99国产亚洲高清观看首页| 久久亚洲精品国产精品婷婷| a在线观看免费网址大全| 免费高清在线爱做视频| 亚洲爆乳无码一区二区三区| 亚洲熟妇久久精品| 日韩电影免费在线观看| 国产极品美女高潮抽搐免费网站| 亚洲AV无码一区二区乱孑伦AS | 亚洲精品在线观看视频| 亚洲AV无码片一区二区三区| 老汉精品免费AV在线播放| 亚洲 小说区 图片区 都市| 亚洲国产精品综合一区在线| 岛国精品一区免费视频在线观看 | 香港特级三A毛片免费观看| 777成影片免费观看|