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

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

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

    零雨其蒙's Blog

    做優(yōu)秀的程序員
    隨筆 - 59, 文章 - 13, 評論 - 58, 引用 - 0
    數(shù)據(jù)加載中……

    Spring的事務處理

    Spring 的事務處理

    (零雨其蒙原創(chuàng),轉(zhuǎn)載請注明)

    一、概述

    (一)基本概念

    1 、什么是Spring事務處理?

    什么是事務處理我就不想回答了。 Spring 的事務處理,可以說是 Spring AOP 的一種實現(xiàn)。因為事務處理是所謂方面( Aspect )的一個子集。因此默認情況下,事務處理是利用 Java 動態(tài)代理機制實現(xiàn)的,這樣就必須先定義一個接口,然后再編寫實現(xiàn);而對于沒有接口的 Javabean ,則通過 CGLIB 實現(xiàn)。這部分是 Spring AOP 部分的內(nèi)容。

    2 、兩種事務處理方式

    EJB 一樣, Spring 也提供兩種事務處理方式,一種是編程式事務處理;一種是聲明式事務處理。

    (二)框架圖

    實現(xiàn)事務處理的兩種方式

    Java 動態(tài)代理

    CGLIB

    ?

    兩種事務處理方式

    編程式事務處理

    聲明式事務處理

    ?

    (三)何時使用什么

    ????????? 如果需要大量的事務處理,就用聲明式事務處理,如果很少的事務處理,就用編程式

    二、詳細

    ????????????? 編程式事務處理與聲明式事務處理

    (一)編程式事務處理

    1 、使用TransactionTemplate進行事務處理(Spring進行commitrollback

    ????????? 1 )使用事務處理的類

    ?

    import javax.sql.DataSource;

    import org.springframework.jdbc.core.*;

    import org.springframework.transaction.*;

    import org.springframework.dao.*;

    ?

    public class bookDAO{

    private DataSource dataSource;// 依賴注入 dataSource ,管理數(shù)據(jù)庫

    private PlatformTransationManager transactionManager;// 依賴注入管理事務

    ?

    public void setDataSource(DataSource dataSource){

    ??? this.dataSource=dataSource;

    }

    ?

    ???? public void setTransactionManager(PlatformTransationManager transactionManager){

    ???????? this. transactionManager= transactionManager;

    }

    ?

    public int create(String msg){

    ??? TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);

    ? ? // 調(diào)用 transactionTemplate execute 方法進行事務管理

    ??? Object result= transactionTemplate.execute (

    ???? // 這是一個回調(diào)函數(shù),實現(xiàn)了 TransactionCallback 接口的 doInTransaction 方法,就是在這個方法里寫數(shù)據(jù)庫新增數(shù)據(jù)的操作

    ? ? ?? ? ?new TransactionCallback()

    {

    ????????? public Object doInTransaction(TransactionStatus status)

    {

    ???????????? ?// 數(shù)據(jù)庫操作代碼

    ???????????? ?return resultObject;

    ?????????? }

    ?????? }

    [U1] ? ??? )

    }

    }

    如果不想返回結(jié)果( resultObject ),則可以用 TransactionCallbackWithoutResult 來實現(xiàn) TransactionCallback 接口,代碼如下:

    ???? ? ?new TransactionCallback WithoutResult ()

    {

    ????????? public Object doInTransaction WithoutResult (TransactionStatus status)

    {

    ???????????? ?// 數(shù)據(jù)庫操作代碼

    ????????????

    ?????????? }

    ?????? }

    ?

    2 )配置文件

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

    ?"http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>

    ? ?<!— dataSource à

    ?? <bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>

    ????? <!— 使用SQL Server 數(shù) 據(jù) à

    ?????? <property name=”driverClassName”>

    ????????? <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>

    ?????? </property>

    ??????? <property name=”url”>

    ????????? <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>

    ?????? </property>

    <property name=”name”>

    ????????? <value>admin</value>

    ?????? </property>

    <property name=”msg”>

    ????????? <value>admin</value>

    ?????? </property>

    ??? </bean>

    ?

    ??? <!— 設定 transactionManager à

    ??? <bean id=”transactionManager”

    class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>

    ???? ???<property name=”dataSource”>

    ??????????? <ref bean=”dataSource”/>

    ??????? </property>

    ??? </bean>

    ?

    ?? <!— 示例中 DAO-->

    ? ? <bean id=”bookDAO” class=”com.bookDAO”>

    ??????? <property name=”dataSource”>

    ??????????? <ref bean=”dataSource”/>

    ??????? </property>

    ??????? <property name=”transactionManager”>

    ??????????? <ref bean=”transactionManager”>

    ??????? </property>

    ?? </bean>

    </beans>

    ?? 這樣 Spring 就可以自動進行 commit rollback 這兩個操作了。粉色部分是為了和 bookDAO 中的粉色部分相匹配。

    2 、使用JdbcTemplate進行事務處理(硬編碼進行commitrollback

    1 )使用事務處理的類

    ?

    import javax.sql.DataSource;

    import org.springframework.jdbc.core.*;

    import org.springframework.transaction.*;

    import org.springframework.dao.*;

    ?

    public class bookDAO{

    private DataSource dataSource;// 依賴注入 dataSource ,管理數(shù)據(jù)庫

    private PlatformTransationManager transactionManager;// 依賴注入管理事務

    ?

    public void setDataSource(DataSource dataSource){

    ??? this.dataSource=dataSource;

    }

    ?

    ???? public void setTransactionManager(PlatformTransationManager transactionManager){

    ???????? this. transactionManager= transactionManager;

    }

    ?

    public int create(String msg){

    ? /*? TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);

    ????? Object result= transactionTemplate.execute (

    ???? ??new TransactionCallback()

    {

    ????????? public Object doInTransaction(TransactionStatus status)

    {

    ?

    ????????????? return resultObject;

    ?????????? }

    ?????? }

    ??? )*/

    ? // 使用下面的代碼替換上面注釋掉的部分

    ? ? DefaultTransactionDefinition def =new DefaultTransactionDefinition();

    ?? TransactionStatus status=transactionManager.getTransaction(def);

    ?? try

    {

    ??????? JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);

    ??????? jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);

    ?? }

    ?? catch(DataAccessException ex)

    {

    ???? ??transactionzManager.rollback(status);

    ?????? throw ex;

    ?? }

    ?? finally

    ?? {

    ???? ? ?transactionManager.commit(status);

    ?? }

    }

    }

    2 )配置文件

    同上

    ?

    ( )聲明式事務處理

    1 )使用事務處理的類

    ?

    import javax.sql.DataSource;

    import org.springframework.jdbc.core.*;

    import org.springframework.transaction.*;

    import org.springframework.dao.*;

    ?

    public class bookDAO{

    private DataSource dataSource;// 依賴注入 dataSource ,管理數(shù)據(jù)庫

    private PlatformTransationManager transactionManager;// 依賴注入管理事務

    ?

    public void setDataSource(DataSource dataSource){

    ??? this.dataSource=dataSource;

    }

    ?

    ???? public void setTransactionManager(PlatformTransationManager transactionManager){

    ???????? this. transactionManager= transactionManager;

    }

    ?

    public int create(String msg){

    ? /*? TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);

    ????? Object result= transactionTemplate.execute (

    ???? ??new TransactionCallback()

    {

    ????????? public Object doInTransaction(TransactionStatus status)

    {

    ?

    ????????????? return resultObject;

    ?????????? }

    ?????? }

    ??? )*/

    ?

    /*? DefaultTransactionDefinition def=new DefaultTransactionDefinition();

    ?? TransactionStatus status=transactionManager.getTransaction(def);

    ?? try

    {

    ??????? JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);

    ??????? jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);

    ?? }

    ?? catch(DataAccessException ex)

    {

    ?????? transactionzManager.rollback(status);

    ?????? throw ex;

    ?? }

    ? ? finally

    ?? {

    ?????? transactionManager.commit(status);

    ?? } */

    // 使用下面的代碼替換上面注釋掉的部分

    ? ?? JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);

    ??? jdbcTemplate.update(“INSERT INFO book VALUES(1,’gf’,’Mastering Spring’)”);

    / / 相比,此段代碼省去了 commit rollback 事務處理語句;與 相比,不必實現(xiàn) TransactionCallback 接口

    }

    }

    2 )配置文件

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

    ?"http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>

    ?? <!— dataSource à

    ?? <bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>

    ????? <!— 使用SQL Server 數(shù) 據(jù) à

    ?????? <property name=”driverClassName”>

    ????????? <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>

    ?????? </property>

    ??????? <property name=”url”>

    ????????? <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>

    ?????? </property>

    <property name=”name”>

    ????????? <value>admin</value>

    ?????? </property>

    <property name=”msg”>

    ????????? <value>admin</value>

    ?????? </property>

    ??? </bean>

    ?

    ??? <!— 設定 transactionManager à

    ??? <bean id=”transactionManager”

    class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>

    ??????? <property name=”dataSource”>

    ??????????? <ref bean=”dataSource”/>

    ??????? </property>

    ??? </bean>

    ?

    ?? <!— 示例中 DAO-->

    ? ? <bean id=”bookDAO” class=”com.bookDAO”>

    ??????? <property name=”dataSource”>

    ??????????? <ref bean=”dataSource”/>

    ??????? </property>

    ? ??<!— 與編程式事務處理相比,在 DAO 設置中去掉了這個屬性,把它放到了代理類中。 - à

    ?

    ??? <!— ?? <property name=”transactionManager”>

    ??????????? <ref bean=”transactionManager”>

    ??????? </property> - à

    ?

    ?? </bean>

    ?? <!— 聲明式事務處理 - à

    ?? <bean id=”bookDAOProxy” class=”org.springframework.transaction.interceptor.Transation.ProxyFactoryBean”>

    ??????? <property name=”transacionManager”>

    ??????????? <ref bean=”transacionMaganer”/>

    ??? ????</property>

    <property name=”target”>

    ??????????? <ref bean=”bookDAO”/>

    ??????? </property>

    <property name=”transactionAttributes”>

    ??????????? <props>

    ?????????? ????<!-- 表示對 bookDAO 中的 create 方法進行事務處理,并指明當前沒有事務就新建一個(用 PROPAGATION_REQUIRED 常量來表示的) à

    ??????????????? <prop key=”create * ”>PROPAGATION_REQUIRED</prop>

    ??????????? </props>

    ??????? </property> ?

    ?? </bean>

    </beans>

    ?


    ?[U1] Template 模式

    posted on 2007-02-06 17:06 零雨其蒙 閱讀(17206) 評論(5)  編輯  收藏

    評論

    # re: Spring的事務處理[未登錄]  回復  更多評論   

    聲明式事務比較簡潔,配合上2.0的新特性更加好用。
    只不過這種事務都是通過AOP動態(tài)織入的
    2007-02-06 22:43 | role0523

    # re: Spring的事務處理[未登錄]  回復  更多評論   

    不錯 頂!!

    可惜
    (二)框架圖
    .................................


    圖片看不到
    2007-02-09 23:13 | lusm

    # re: Spring的事務處理  回復  更多評論   

    不錯 ,收藏了
    2008-09-22 16:39 | 冰河快狼

    # re: Spring的事務處理[未登錄]  回復  更多評論   

    老大,說實話,這代碼跑到絕對有問題 了,好幾處都錯了,運行下就知道了,不多提供了很好的思路
    2013-11-11 10:10 | 大海

    # re: Spring的事務處理[未登錄]  回復  更多評論   

    老大,錯太多了啊
    2013-11-11 10:21 | 大海

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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 又粗又硬又黄又爽的免费视频| 亚洲酒色1314狠狠做| 国产在线ts人妖免费视频| 成人免费无码大片A毛片抽搐| 四虎影视无码永久免费| 亚洲国产激情在线一区| 亚洲videos| 国产成人亚洲综合一区| 亚洲A∨无码一区二区三区| 国产色婷婷精品免费视频| 18观看免费永久视频| 一级毛片免费播放视频| 亚洲日韩一区二区三区| 亚洲人成未满十八禁网站| 亚洲av日韩综合一区二区三区| 亚洲人成免费网站| 亚洲13又紧又嫩又水多| 亚洲精品无码mⅴ在线观看| 日本系列1页亚洲系列| 一级毛片人与动免费观看| 亚洲国产aⅴ成人精品无吗| 亚洲1区2区3区精华液| 国产男女爽爽爽免费视频| 色天使亚洲综合一区二区| 一级一片免费视频播放| 国内永久免费crm系统z在线| 日韩毛片免费一二三| 丰满人妻一区二区三区免费视频| 鲁啊鲁在线视频免费播放| 国产精品午夜免费观看网站| 中文字幕无码日韩专区免费| 亚洲啪啪免费视频| 国产青草视频免费观看97| 亚洲一区二区三区影院| 爱情岛论坛网亚洲品质自拍| 免费不卡中文字幕在线| 亚洲人成色777777在线观看 | 一进一出60分钟免费视频| 97在线视频免费公开视频| 91免费国产精品| 国产高清免费观看|