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

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

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

    零雨其蒙's Blog

    做優秀的程序員
    隨筆 - 59, 文章 - 13, 評論 - 58, 引用 - 0
    數據加載中……

    Spring的事務處理

    Spring 的事務處理

    (零雨其蒙原創,轉載請注明)

    一、概述

    (一)基本概念

    1 、什么是Spring事務處理?

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

    2 、兩種事務處理方式

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

    (二)框架圖

    實現事務處理的兩種方式

    Java 動態代理

    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 ,管理數據庫

    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);

    ? ? // 調用 transactionTemplate execute 方法進行事務管理

    ??? Object result= transactionTemplate.execute (

    ???? // 這是一個回調函數,實現了 TransactionCallback 接口的 doInTransaction 方法,就是在這個方法里寫數據庫新增數據的操作

    ? ? ?? ? ?new TransactionCallback()

    {

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

    {

    ???????????? ?// 數據庫操作代碼

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

    ?????????? }

    ?????? }

    [U1] ? ??? )

    }

    }

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

    ???? ? ?new TransactionCallback WithoutResult ()

    {

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

    {

    ???????????? ?// 數據庫操作代碼

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

    ?????????? }

    ?????? }

    ?

    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 à

    ?????? <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 ,管理數據庫

    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 ,管理數據庫

    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 事務處理語句;與 相比,不必實現 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 à

    ?????? <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動態織入的
    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 | 大海

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲AV无码不卡无码| 免费日本一区二区| 亚洲伊人tv综合网色| 亚洲精品国产高清嫩草影院 | 可以免费看的卡一卡二| www在线观看播放免费视频日本| 精品亚洲AV无码一区二区| 亚洲AV午夜福利精品一区二区| 四虎永久成人免费影院域名| av无码免费一区二区三区| 久久亚洲中文字幕精品一区四 | 亚洲a视频在线观看| 国产V亚洲V天堂无码| 亚洲 综合 国产 欧洲 丝袜| 黄网址在线永久免费观看| 亚洲中文无码永久免费| 99re在线这里只有精品免费| 国内永久免费crm系统z在线 | 亚洲宅男天堂在线观看无病毒| 波多野结衣中文一区二区免费| 免费看无码自慰一区二区| 日韩视频在线精品视频免费观看| 免费人成在线观看网站品爱网| 国产精品偷伦视频免费观看了| 手机永久免费的AV在线电影网| 亚洲AV无码之国产精品| 亚洲欧美国产欧美色欲| 亚洲一级毛片免费观看| 亚洲一区中文字幕在线观看| 亚洲最新黄色网址| 亚洲视频免费一区| 亚洲欧洲日产国码在线观看| 91亚洲国产成人久久精品| 亚洲天堂一区二区三区四区| 亚洲第一成年人网站| 亚洲国产情侣一区二区三区| 亚洲另类春色校园小说| 国产成人精品日本亚洲网址| 亚洲中文字幕久久精品蜜桃| 亚洲欧美日韩中文字幕一区二区三区| 亚洲精品美女久久久久久久|