配置聲明式事務

1、編程式事務

  使用原生的JDBC API進行事務管理java

        [1]獲取數據庫鏈接Connection對象mysql

        [2]取消事務的自動提交spring

        [3]執行操做sql

        [4]正常完成操做時手動提交事務數據庫

        [5]執行失敗時回滾事務express

        [6]關閉相關資源編程

 1   1.編程式事務  2     //1.獲取Connection對象
 3     Connection conn = JDBCUtils.getConnection();  4     try {  5       //2.開啓事務:阻止自動提交
 6       conn.setAutoCommit(false);  7       //3.執行數據庫操做
 8       chain.doFilter(req,resp);  9       //4.提交事務
10       conn.commit(); 11     }catch(Exception e) { 12       //5.回滾事務
13       conn.rollBack(); 14 
15     }finally{ 16       //6.釋放資源
17     }

2、基於註解的聲明式事務

一、基本原理:AOP併發

  [1]前置通知:開啓事務性能

  [2]返回通知:提交事務url

  [3]異常通知:回滾事務

  [4]後置通知:釋放資源

二、事務管理器

  DataSourceTransactionManager:配置該類的bean對象,並配置

三、導入jar包

  [1]IOC容器須要的jar包

      commons-logging-1.1.3.jar
      spring-aop-4.0.0.RELEASE.jar
      spring-aspects-4.0.0.RELEASE.jar
      spring-beans-4.0.0.RELEASE.jar
      spring-context-4.0.0.RELEASE.jar
      spring-core-4.0.0.RELEASE.jar
      spring-expression-4.0.0.RELEASE.jar

  [2]AOP須要的jar包

      com.springsource.net.sf.cglib-2.2.0.jar
      com.springsource.org.aopalliance-1.0.0.jar
      com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

  [3]JdbcTemplate操做須要的jar包

      spring-jdbc-4.0.0.RELEASE.jar
      spring-orm-4.0.0.RELEASE.jar
      spring-tx-4.0.0.RELEASE.jar

  [5]MySQL驅動和C3P0

      c3p0-0.9.1.2.jar
       mysql-connector-java-5.1.37-bin.jar

四、配置

  [1]配置數據源

    <!-- 引入外部屬性文件 -->

      <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 配置數據源 -->

      <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.passowrd}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="driverClass" value="${jdbc.driver}"></property>
      </bean>

  [2]配置JdbcTemplate,並裝配數據源

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      <property name="dataSource" ref="comboPooledDataSource"></property>
    </bean>

  [3]配置事務管理器,並裝配數據源

    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
      <property name= "dataSource" ref ="comboPooledDataSource"/>
    </bean >

  [4]開啓基於註解的聲明式事務功能

    <tx:annotation-driven transaction-manager ="dataSourceTransactionManager"/>
    若是事務管理器的bean的id正好是transaction-manager的默認值transactionManager,則能夠省略

  [5]在事務方法上加@Transactional註解,便可開啓該方法的事務

五、事務屬性的設置

  ①事務的傳播行爲

    事務傳播屬性能夠在@Transactional註解的propagation屬性中定義。

                                     

  REQUIRED

                                     

 

   REQUIRES_NEW

                                        

  ②事務的隔離級別

    用@Transactional註解聲明式地管理事務時能夠在@Transactional的isolation屬性中設置隔離級別

      ①讀未提交:READ UNCOMMITTED

          容許Transaction01讀取Transaction02未提交的修改。

      ②讀已提交:READ COMMITTED

               要求Transaction01只能讀取Transaction02已提交的修改。

      ③可重複讀:REPEATABLE READ

               確保Transaction01能夠屢次從一個字段中讀取到相同的值,即Transaction01執行期間禁止其它事務對這個字段進行更新。

      ④串行化:SERIALIZABLE

               確保Transaction01能夠屢次從一個表中讀取到相同的行,在Transaction01執行期間,禁止其它事務對這個表進行添加、更新、刪除操做。能夠避免任何併發問題,但性能十分低下。

  ③事務根據什麼異常不進行回滾

    @Transactional 註解

      [1]rollbackFor屬性:指定遇到時必須進行回滾的異常類型,能夠爲多個

      [2]noRollbackFor屬性:指定遇到時不回滾的異常類型,能夠爲多個


  ④事務的超時屬性

      @Transactional的timeout屬性中設置超時屬性

  ⑤事務的只讀屬性

      @Transactional的readOnly=true屬性中設置只讀屬性,多用於查詢操做

3、基於xml的聲明式事務

  一、配置數據源

    <!-- 引入外部屬性文件 -->

      <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 配置數據源 -->

      <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.passowrd}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="driverClass" value="${jdbc.driver}"></property>
      </bean>

  二、配置JdbcTemplate,並裝配數據源

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      <property name="dataSource" ref="comboPooledDataSource"></property>
    </bean>

  三、配置事務管理器,並裝配數據源

    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
      <property name= "dataSource" ref ="comboPooledDataSource"/>
    </bean >

  四、配置切入點表達式

    經過<aop:config></aop:config>標籤

      配置切入點表達式<aop:pointcut></aop:pointcut>

      經過<aop:advisor></aop:advisor>標籤將事務與切入點表達式聯繫起來,明確事務做用的對象

  五、配置事務

    經過<tx:advice></tx:advice>標籤的 transaction-manager屬性將當前事物加入到事務管理器

      經過<tx:attributes></tx:attributes>標籤下的<tx:method></tx:method>標籤,配置事務做用範圍內的方法的傳播行爲、隔離級別、異常回滾、超時屬性和只讀屬性

  六、詳細步驟:

<!-- 配置基於XML文件的聲明式事務 -->

  <aop:config>

    <!-- 配置切入點表達式 -->

    <aop:pointcut expression="execution(* com.neuedu.tx.service.BookService.*(String, String))" id="txPointCut"/>

    <!-- 將事務切入點和事務建議的配置聯繫起來 -->

    <aop:advisor advice-ref="bookTransaction" pointcut-ref="txPointCut"/>

  </aop:config>

  <!-- 設置事務屬性 -->

    <tx:advice id="bookTransaction" transaction-manager="dataSourceTransactionManager">
      <tx:attributes>
        <tx:method name="doCash"
          propagation="REQUIRED"
          isolation="READ_COMMITTED"
          read-only="false"
          no-rollback-for="java.lang.ArithmeticException"
          timeout="3" />

        <!-- 將某一類方法統一設置爲只讀 -->
        <tx:method name="get*" read-only="true"/>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="query*" read-only="true"/>
      </tx:attributes>
    </tx:advice>

相關文章
相關標籤/搜索