紙飛機

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            22 隨筆 :: 28 文章 :: 30 評論 :: 0 Trackbacks
          轉(zhuǎn)自:http://blog.csdn.net/sunyadongwanghbjm/archive/2007/08/29/1763819.aspx

          spring事務管理
             在學習spring事務管理時,我忍不住要問,spring為什么進行事務管理,spring怎么進行的事務管理?
              首先,為什么要進行事務,請參考http://blog.csdn.net/sunyadongwanghbjm/archive/2007/08/20/1751518.aspx
          接下來說說spring是怎樣進行事務管理的.
           Spring事務策略
              Spring事務策略,也就是spring事務管理的實現(xiàn)方式.它有一個統(tǒng)一的抽象是由實現(xiàn)下面這個接口完成的.
              org.springframework.transaction.PlatformTransactionManager
              此接口的內(nèi)容如下:
            
          Public interface PlatformTransactionManager{
                     TransactionStatue getTransaction(TransactionDefinition definition) 
          throws TransactionException;
                     Void commit(TransactionStatus status) 
          throws TransactionException;
                     Void rollback(TransactionStatus status) 
          throws TransactionException;
          }

             
           不管是聲明式的還是編程式的事務管理都需要此抽象來完成.
          解釋一下這個接口,這樣可以更好的理解spring的事務控制的原理.
          getTransaction()根據(jù)類型為TransactionDefinition的參數(shù)返回一個TransactionStatus對象.返回的TransactionStatus對象可能代表一個新的或已經(jīng)存在的事務(如果在當前調(diào)用堆棧有一個符合條件的事務).如同J2EE事務上下文,一個TransactionStatus也是和執(zhí)行的線程關聯(lián)的.
          同時,在框架中還存在TransactionDefinition接口,即上邊的參數(shù)類型.此接口指定了事務隔離程度、事務傳播、事務超時、只讀狀態(tài)。
          另外,還有TransactionStatus接口。這個接口為處理事務提供簡單的控制事務執(zhí)行和查詢事務狀態(tài)的方法。
              
              兩種事務管理方式:編程式、聲明式。
          Spring提供兩種方式的編程式事務管理,分別是:使用TransactionTemplate和直接使用PlatformTransactionManager
          ⅰ. TransactionTempale采用和其他Spring模板,如JdbcTempalte和HibernateTemplate一樣的方法。它使用回調(diào)方法,把應用程序從處理取得和釋放資源中解脫出來。如同其他模板,TransactionTemplate是線程安全的。
          代碼片段:
          Object result = tt.execute(new TransactionCallback(){
             
          public Object doTransaction(TransactionStatus status){
                  updateOperation();
                  
          return resultOfUpdateOperation();
             }

          }
          );
          使用TransactionCallback()可以返回一個值。
          如果使用TransactionCallbackWithoutResult則沒有返回值。
          . 也可以使用PlatformTransactionManager直接管理事務。簡單地通過一個bean引用給你的bean傳遞一個你使用的PlatformTransaction對象。然后,使用TransactionDefinitionTransactionStatus對象就可以發(fā)起、回滾、提交事務。
          如下片段:
          DefaultTransactionDefinition   def= new DefaultTransactionDefinition();                   //new 一個事務
          def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //初始化事務,參數(shù)定義事務的傳播類型;
          TransactionStatus  status = transactionManager.getTransaction(def);                    //獲得事務狀態(tài)
          try{
             ……………..
             transactionManager.commit(status); 
          //提交事務;
          }
          catch(…..){
             transactionManager.rollback(status); 
          //回滾事務;
          }

           
          Spring也提供聲明式事務管理。這是通過AOP實現(xiàn)的。
          大多數(shù)Spring用戶選擇聲明式事務管理,這是最少影響應用代碼的選擇,因而這是和非侵入性的輕量級容器的觀念是一致的。
           通常通過TransactionProxyFactoryBean設置Spring事務代理。需要一個目標對象包裝在事務代理中。這個目標對象一般是一個普通Javabean。當我們定義TransactionProxyFactoryBean時,必須提供一個相關的PlatformTransactionManager的引用和事務屬性。事務屬性含有事務定義。例如:
          <bean id="transactionService"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                  
          <property name="transactionManager">
                      
          <ref   local="transactionManager"/>
                  
          </property>   
                  
          <property  name="target">
                      
          <ref  local="transactionServiceControl"/>            
                  
          </property>
                   
          <property  name="transactionAttributes">
                      
          <props>
                        
          <prop key=”insert*”>PROPAGATION_REQUIRED,-MyCheckedException</prop>
          <prop key=”update*”>PROPAGATION_REQUIRED</prop>
          <prop key=”*”>PROPAGATION_REQUIRED,readOnly</prop>
                      
          </props>
                  
          </property>
          </bean>
          事務代理會實現(xiàn)目標對象的接口:這里是屬性名是target的引用。id是transactionServiceControl。(●使用CGLIB也可以實現(xiàn)具體類的代理。只要設置proxyTargetClass屬性為true即可。如果目標對象沒有實現(xiàn)任何接口,這將自動設置該屬性為true。通常,我們希望面向接口編程。) ●使用proxyInterfaces屬性來限定事務代理來代理指定接口也是可以。 ●也可以通過從org.springframework.aop.framework.ProxyConfig繼承或所有AOP代理工廠共享的屬性來定制TransactionProxyFactoryBean行為。
          然后,說說屬性名是transactionAttributes意義
          這里的transactionAttributes屬性是定義在org.springframework.transaction.interceptor.NameMathTransactionAttributeSource中的屬性格式設置。這個包括通配符的方法名稱映射是很直觀的,如”insert*”。注意insert*的映射的值包括回滾規(guī)則。”-MyCheckException”指定如果方法拋出MyCheckException或它的子類,事務會自動回滾。可以用逗號分隔多個回滾規(guī)則。“-”前綴強制回滾,“+”前綴指定提交(這允許即使拋出unchecked異常時也可以提交事務)。“PROPAGATION_REQUIRED”指定事務傳播范圍。
          TransactionProxyFactoryBean允許你通過“preInterceptors”和“postInterceptors”屬性設置前或后的攔截操作。可以設置任意數(shù)量的前和后通過,它們的類型可以是Advistor(切入點),MethodInterceptor或被當前Spring配置支持的通知類型。例如:ThrowAdvice,AfterReturningAdvice或BeforeAdvice。這些通知必須支持實例共享模式。如果你需要高級AOP特性操作事務,通過org.springframework.aop.framework.ProxyFactoryBean,而不是TransactionProxyFactory實用代理創(chuàng)建者。
             另一種聲明方式:BeanNameAutoProxyCreator
          使用TransactionProxyFactoryBean當事務代理包裝對象,你可以完全控制代理。如果需要用一致方式包裝大量bean。使用一個BeanFactoryPostProcessor的一個實現(xiàn),BeanNameAutoProxyCreator,可以提供另外一種方法。(Spring中,一旦ApplicationContext讀完它的初始化信息,它將初始化所有實現(xiàn)BeanPostProcessor接口的bean,并且讓它們后處理ApplicationContext中所有其他的bean。所以使用這種機制,正確配置的BeanNameAutoProxyCreator可以用來后處理所有ApplicationContext中所有其他的bean),并且把它們用事務代理包裝起來。真正生成的事務代理和使用TransactionProxyFactoryBean生成的基本一致。
          最后,總結一下Spring的優(yōu)點:
                        為不同的事務API提供一致的編程模型,如JTA、JDBC、Hibernate、iBATIS數(shù)據(jù)庫層JDO
                        提供比大多數(shù)事務API更簡單的、易于使用的編程式事務管理API
                        整合Spring數(shù)據(jù)訪問抽象
                        支持Spring聲明式事務管理
          posted on 2010-01-18 16:57 紙飛機 閱讀(212) 評論(0)  編輯  收藏 所屬分類: Spring

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 左云县| 永修县| 苗栗市| 扎囊县| 沙湾县| 醴陵市| 五家渠市| 永春县| 墨脱县| 阜城县| 伊金霍洛旗| 贡嘎县| 麟游县| 丰原市| 略阳县| 贵南县| 时尚| 南投市| 会宁县| 吴旗县| 云安县| 新建县| 崇文区| 乌鲁木齐县| 安吉县| 宜良县| 安图县| 澄城县| 翁牛特旗| 南部县| 游戏| 巴彦淖尔市| 临桂县| 吉木乃县| 兰西县| 湛江市| 甘肃省| 库车县| 丰原市| 萨嘎县| 甘泉县|