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

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

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

    我的java天地

    Spring事務管理

    在學習spring事務管理時,我忍不住要問,spring為什么進行事務管理,spring怎么進行的事務管理?
    首先,為什么要進行事務,接下來說說spring是怎樣進行事務管理的.
    Spring事務策略
    Spring事務策略,也就是spring事務管理的實現方式.它有一個統一的抽象是由實現下面這個接口完成的.
    org.springframework.transaction.PlatformTransactionManager
    此接口的內容如下:
    Public interface PlatformTransactionManager()...{TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;Void commit(TransactionStatus status) throws TransactionException;Void rollback(TransactionStatus status) throws TransactionException;}

    不管是聲明式的還是編程式的事務管理都需要此抽象來完成.
    解釋一下這個接口,這樣可以更好的理解spring的事務控制的原理.
    getTransaction()根據類型為TransactionDefinition的參數返回一個TransactionStatus對象.返回的TransactionStatus對象可能代表一個新的或已經存在的事務(如果在當前調用堆棧有一個符合條件的事務).如同J2EE事務上下文,一個TransactionStatus也是和執行的線程關聯的.
    同時,在框架中還存在TransactionDefinition接口,即上邊的參數類型.此接口指定了事務隔離程度、事務傳播、事務超時、只讀狀態。
    另外,還有TransactionStatus接口。這個接口為處理事務提供簡單的控制事務執行和查詢事務狀態的方法。

    ② 兩種事務管理方式:編程式、聲明式。
    Spring提供兩種方式的編程式事務管理,分別是:使用TransactionTemplate和直接使用PlatformTransactionManager。
    ⅰ. TransactionTempale采用和其他Spring模板,如JdbcTempalte和HibernateTemplate一樣的方法。它使用回調方法,把應用程序從處理取得和釋放資源中解脫出來。如同其他模板,TransactionTemplate是線程安全的。
    代碼片段: Object result = tt.execute(new TransactionCallback()...{public Object doTransaction(TransactionStatus status)...{updateOperation();return resultOfUpdateOperation();}});

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

    Spring也提供聲明式事務管理。這是通過AOP實現的。
    大多數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>

    事務代理會實現目標對象的接口:這里是屬性名是target的引用。id是transactionServiceControl。(●使用CGLIB也可以實現具體類的代理。只要設置proxyTargetClass屬性為true即可。如果目標對象沒有實現任何接口,這將自動設置該屬性為true。通常,我們希望面向接口編程。) ●使用proxyInterfaces屬性來限定事務代理來代理指定接口也是可以。 ●也可以通過從org.springframework.aop.framework.ProxyConfig繼承或所有AOP代理工廠共享的屬性來定制TransactionProxyFactoryBean行為。
    然后,說說屬性名是transactionAttributes意義:
    這里的transactionAttributes屬性是定義在org.springframework.transaction.interceptor.NameMathTransactionAttributeSource中的屬性格式設置。這個包括通配符的方法名稱映射是很直觀的,如”insert*”。注意insert*的映射的值包括回滾規則。”-MyCheckException”指定如果方法拋出MyCheckException或它的子類,事務會自動回滾。可以用逗號分隔多個回滾規則。“-”前綴強制回滾,“+”前綴指定提交(這允許即使拋出unchecked異常時也可以提交事務)。“PROPAGATION_REQUIRED”指定事務傳播范圍。
    TransactionProxyFactoryBean允許你通過“preInterceptors”和“postInterceptors”屬性設置前或后的攔截操作。可以設置任意數量的前和后通過,它們的類型可以是Advistor(切入點),MethodInterceptor或被當前Spring配置支持的通知類型。例如:ThrowAdvice,AfterReturningAdvice或BeforeAdvice。這些通知必須支持實例共享模式。如果你需要高級AOP特性操作事務,通過org.springframework.aop.framework.ProxyFactoryBean,而不是TransactionProxyFactory實用代理創建者。
    ② 另一種聲明方式:BeanNameAutoProxyCreator
    使用TransactionProxyFactoryBean當事務代理包裝對象,你可以完全控制代理。如果需要用一致方式包裝大量bean。使用一個BeanFactoryPostProcessor的一個實現,BeanNameAutoProxyCreator,可以提供另外一種方法。(Spring中,一旦ApplicationContext讀完它的初始化信息,它將初始化所有實現BeanPostProcessor接口的bean,并且讓它們后處理ApplicationContext中所有其他的bean。所以使用這種機制,正確配置的BeanNameAutoProxyCreator可以用來后處理所有ApplicationContext中所有其他的bean),并且把它們用事務代理包裝起來。真正生成的事務代理和使用TransactionProxyFactoryBean生成的基本一致。
    最后,總結一下Spring的優點:
    ★ 為不同的事務API提供一致的編程模型,如JTA、JDBC、Hibernate、iBATIS數據庫層JDO
    ★ 提供比大多數事務API更簡單的、易于使用的編程式事務管理API
    ★ 整合Spring數據訪問抽象
    ★ 支持Spring聲明式事務管理

    posted on 2009-03-21 03:17 tobyxiong 閱讀(225) 評論(0)  編輯  收藏 所屬分類: java

    <2009年3月>
    22232425262728
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導航

    統計

    常用鏈接

    留言簿(3)

    隨筆分類(144)

    隨筆檔案(157)

    相冊

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 狠狠色香婷婷久久亚洲精品| 亚洲人成网77777色在线播放| 亚洲视频在线观看网站| 国产精品视频白浆免费视频| 国产亚洲精品高清在线| 国产成人无码精品久久久久免费| 久久综合亚洲色HEZYO国产| A毛片毛片看免费| 国产亚洲一区二区三区在线观看 | 亚洲AV色欲色欲WWW| 拔擦拔擦8x华人免费久久| 国产亚洲综合视频| 亚洲Av无码国产情品久久 | 亚洲一卡2卡4卡5卡6卡在线99 | 亚洲AV成人无码久久WWW| 国产免费小视频在线观看| 男女猛烈xx00免费视频试看| 亚洲人成无码网WWW| 成人免费区一区二区三区| 亚洲最大成人网色| 成人免费AA片在线观看| 麻豆一区二区三区蜜桃免费| 久久亚洲AV永久无码精品| 日韩精品极品视频在线观看免费| 亚洲伊人久久精品| www亚洲一级视频com| a视频免费在线观看| 亚洲一本之道高清乱码| 亚洲AV网站在线观看| 国产午夜精品久久久久免费视| 亚洲成A∨人片在线观看无码| 国产小视频在线观看免费| 中文字幕久精品免费视频| 亚洲1区1区3区4区产品乱码芒果| 免费观看四虎精品国产永久| 中文字幕无码免费久久| 亚洲成a人片在线不卡一二三区| 亚洲日韩精品A∨片无码| 99re热免费精品视频观看| 国产精品无码免费专区午夜| 亚洲一区二区三区亚瑟|