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

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

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

    我的java天地

    Spring事務(wù)管理

    在學(xué)習(xí)spring事務(wù)管理時(shí),我忍不住要問(wèn),spring為什么進(jìn)行事務(wù)管理,spring怎么進(jìn)行的事務(wù)管理?
    首先,為什么要進(jìn)行事務(wù),接下來(lái)說(shuō)說(shuō)spring是怎樣進(jìn)行事務(wù)管理的.
    Spring事務(wù)策略
    Spring事務(wù)策略,也就是spring事務(wù)管理的實(shí)現(xiàn)方式.它有一個(gè)統(tǒng)一的抽象是由實(shí)現(xiàn)下面這個(gè)接口完成的.
    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;}

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

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

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

    Spring也提供聲明式事務(wù)管理。這是通過(guò)AOP實(shí)現(xiàn)的。
    大多數(shù)Spring用戶選擇聲明式事務(wù)管理,這是最少影響應(yīng)用代碼的選擇,因而這是和非侵入性的輕量級(jí)容器的觀念是一致的。
    ① 通常通過(guò)TransactionProxyFactoryBean設(shè)置Spring事務(wù)代理。需要一個(gè)目標(biāo)對(duì)象包裝在事務(wù)代理中。這個(gè)目標(biāo)對(duì)象一般是一個(gè)普通Javabean。當(dāng)我們定義TransactionProxyFactoryBean時(shí),必須提供一個(gè)相關(guān)的PlatformTransactionManager的引用和事務(wù)屬性。事務(wù)屬性含有事務(wù)定義。例如: <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>

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

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

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

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(3)

    隨筆分類(144)

    隨筆檔案(157)

    相冊(cè)

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: a在线视频免费观看| 亚洲伊人精品综合在合线| 亚洲色欲久久久久综合网| 又黄又爽的视频免费看| 国产又大又长又粗又硬的免费视频| 24小时日本在线www免费的| 99在线精品视频观看免费| 亚洲电影免费观看| 国产男女爽爽爽爽爽免费视频| 在线美女免费观看网站h| 亚洲国产日韩在线视频| 中文字幕日韩亚洲| 亚洲中文久久精品无码| 亚洲日韩欧洲乱码AV夜夜摸| 国产亚洲精品观看91在线| 亚洲一区二区三区高清| 亚洲国产成人久久综合一区| 亚洲人成免费电影| 亚洲精品色播一区二区 | 久久精品免费一区二区喷潮| 中字幕视频在线永久在线观看免费| 精品国产免费人成网站| a级毛片免费高清毛片视频| 国产精品自拍亚洲| 人成午夜免费大片在线观看| 久久精品成人免费国产片小草 | 亚洲福利一区二区精品秒拍| 亚洲人成网站18禁止久久影院| 一本色道久久88亚洲精品综合 | 超pen个人视频国产免费观看| 国产国产人免费视频成69大陆| 亚洲国产成人乱码精品女人久久久不卡 | 99免费观看视频| 在免费jizzjizz在线播| 成人A级毛片免费观看AV网站| 国产猛烈高潮尖叫视频免费| 久久亚洲国产成人影院网站| 亚洲综合无码一区二区| 狠狠色伊人亚洲综合网站色| 理论秋霞在线看免费| 久久精品免费观看|