1. 程式人生 > >spring事務傳播機制例項講解

spring事務傳播機制例項講解

  1. 對於SQL事務的概念以及ACID性質,可以參見我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011
  2. spring的管理的事務可以分為如下2類
    1. 邏輯事務   在spring中定義的事務通常指邏輯事務,提供比物理事務更抽象,方便的事務配置管理,但也基於物理事務
    2. 物理事務  特定於資料庫的事務
  3. spring中支援一下2中事務宣告方式
    1. 程式設計式事務  當系統需要明確的,細粒度的控制各個事務的邊界,應選擇程式設計式事務
    2. 宣告式事務  當系統對於事務的控制粒度較粗時,應該選擇申明式事務
    3. 無論你選擇上述何種事務方式去實現事務控制,spring都提供基於門面設計模式的事務管理器供選擇,如下是spring事務中支援的事務管理器
    4. 事務管理器實現(org.springframework.*) 使用時機
      jdbc.datasource.DataSourceTransactionManager 使用jdbc的抽象以及ibatis支援
      orm.hibernate.HibernateTransactionManager 使用hibernate支援(預設3.0以下版本)
      orm.hibernate3.HibernateTransactionManager 使用hibernate3支援
      transaction.jta.JtaTransactionManager 使用分散式事務(分散式資料庫支援)
      orm.jpa.JpaTransactionManager 使用jpa做為持久化工具
      orm.toplink.TopLinkTransactionManager 使用TopLink持久化工具
      orm.jdo.JdoTransactionManager 使用Jdo持久化工具
      jms.connection.JmsTransactionManager 使用JMS 1.1+
      jms.connection.JmsTransactionManager102 使用JMS 1.0.2
      transaction.jta.OC4JJtaTransactionManager 使用oracle的OC4J JEE容器
      transaction.jta.WebLogicJtaTransactionManager 在weblogic中使用分散式資料庫
      jca.cci.connection.CciLocalTransactionManager 使用jrping對J2EE Connector Architecture (JCA)
      和Common Client Interface (CCI)的支援

UML結構圖如下



  4、各種事務管理器的定義如下

  •  
    • JdbcTransactionManager定義如下
      1. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  <property name="dataSource" ref="dataSource"/>  
      2. </bean>  
        
    • hibernate事務管理器配置如下
      1. <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  <property name="sessionFactory" ref="sessionFactory"/>
      2. </bean>  
    • hibernate的事務管理器會注入session會話工廠,然後將事務處理委託給當前的transaction物件,
    • 事務提交時,呼叫commit()方法,回滾時呼叫rollback()方法
    • jpa事務管理器配置如下
      1. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  <property name="entityManagerFactory" ref="entityManagerFactory"/>  
      2. </bean>  
       
    • 其餘事務管理器可參見spring in action中說明
  • 5、申明式事務配置
    • spring特有的事務傳播行為,spring支援7種事務傳播行為,確定客戶端和被呼叫端的事務邊界(說得通俗一點就是多個具有事務控制的service的相互呼叫時所形成的複雜的事務邊界控制)下圖所示為7鍾事務傳播機制
    • 傳播行為 含義
      PROPAGATION_REQUIRED(XML檔案中為REQUIRED) 表示當前方法必須在一個具有事務的上下文中執行,
      如有客戶端有事務在進行,
      那麼被呼叫端將在該事務中執行,
      否則的話重新開啟一個事務。
      (如果被呼叫端發生異常,
      那麼呼叫端和被呼叫端事務都將回滾)
      PROPAGATION_SUPPORTS(XML檔案中為SUPPORTS) 表示當前方法不必需要具有一個事務上下文,
      但是如果有一個事務的話,
      它也可以在這個事務中執行
      PROPAGATION_MANDATORY(XML檔案中為MANDATORY) 表示當前方法必須在一個事務中執行,
      如果沒有事務,將丟擲異常
      PROPAGATION_NESTED(XML檔案中為NESTED) 表示如果當前方法正有一個事務在執行中,
      則該方法應該執行在一個巢狀事務中,
      被巢狀的事務可以獨立於被封裝的事務中進行提交或者回滾。
      如果封裝事務存在,並且外層事務丟擲異常回滾,
      那麼內層事務必須回滾,
      反之,內層事務並不影響外層事務。
      如果封裝事務不存在,
      則同PROPAGATION_REQUIRED的一樣
      PROPAGATION_NEVER(XML檔案中為NEVER) 表示當方法務不應該在一個事務中執行,
      如果存在一個事務,則丟擲異常
      PROPAGATION_REQUIRES_NEW(XML檔案中為REQUIRES_NEW) 表示當前方法必須執行在它自己的事務中。
      一個新的事務將啟動,
      而且如果有一個現有的事務在執行的話,
      則這個方法將在執行期被掛起,
      直到新的事務提交或者回滾才恢復執行。
      PROPAGATION_NOT_SUPPORTED(XML檔案中為NOT_SUPPORTED) 表示該方法不應該在一個事務中執行。
      如果有一個事務正在執行,
      他將在執行期被掛起,
      直到這個事務提交或者回滾才恢復執行
  • 6、spring中的事務隔離級別
    • spring的事務隔離級別其實本質上是對SQL92標準的4種事務隔離級別的一種封裝,具體參加我的博文:http://kingj.iteye.com/admin/blogs/1675011
    • spring的事務隔離級別如下表所示
    • 隔離級別 含義
      ISOLATION_DEFAULT 使用資料庫預設的事務隔離級別
      ISOLATION_READ_UNCOMMITTED 允許讀取尚未提交的修改,可能導致髒讀、幻讀和不可重複讀
      ISOLATION_READ_COMMITTED 允許從已經提交的事務讀取,可防止髒讀、但幻讀,不可重複讀仍然有可能發生
      ISOLATION_REPEATABLE_READ 對相同欄位的多次讀取的結果是一致的,
      除非資料被當前事務自生修改。可防止髒讀和不可重複讀,但幻讀仍有可能發生
      ISOLATION_SERIALIZABLE 完全服從ACID隔離原則,確保不發生髒讀、不可重複讀、和幻讀,但執行效率最低。
  • 7、spring事務只讀屬性
    • spring事務只讀的含義是指,如果後端資料庫發現當前事務為只讀事務,那麼就會進行一系列的優化措施。它是在後端資料庫進行實施的,
    • 因此,只有對於那些有可能啟動一個新事務的傳播行為(REQUIRED,REQUIRES_NEW,NESTED)的方法來說,才有意義。
    • (測試表明,當使用JDBC事務管理器並設定當前事務為只讀時,並不能發生預期的效果,即能執行刪除,更新,插入操作)
  • 8、spring的事務超時
    • 有的時候為了系統中關鍵部分的效能問題,它的事務執行時間應該儘可能的短。因此可以給這些事務設定超時時間,以秒為單位。
    • 我們知道事務的開始往往都會發生資料庫的表鎖或者被資料庫優化為行鎖,如果允許時間過長,那麼這些資料會一直被鎖定,影響系統的併發性。
    • 因為超時時鐘是在事務開始的時候啟動,因此只有對於那些有可能啟動新事物的傳播行為(REQUIRED,REQUIRES_NEW,NESTED)的方法來說,
    • 事務超時才有意義。
  • 9、事務回滾規則
    • spring中可以指定當方法執行並丟擲異常的時候,哪些異常回滾事務,哪些異常不回滾事務。
    • 預設情況下,只在方法丟擲執行時異常的時候才回滾(runtime exception)。而在出現受阻異常(checked exception)時不回滾事務,
    • 這個ejb的回滾行為一致。
    • 當然可以採用申明的方式指定哪些受阻異常像執行時異常那樣指定事務回滾。
  • 10、spring申明式事務配置
    • 將aop,tx名稱空間新增到當前的spring配置檔案頭中
    • 定義一個事務AOP通知
      1. <tx:advice id="txAdvice" transactionManager="transactionManager">  
      2.      <tx:attributes>  
      3.          <tx:method name="add*" propagation="REQUIRED"/>  
      4.      </tx:attributes>  
      5. </tx:advice>
    • 定義一個事務切面,即應該在哪些類的哪些方法上面進行事務切入
      1. <aop:config>  
      2.     <aop:advisor pointcut="execution(* *..zx.spring.UserService*.*(..))||execution(* *..spring.ServiceFacade.*(..))||execution(* *..spring.BookService.*(..))" advice-ref="txAdvice"/>  
      3. </aop:config>  
  • 11、結合具體的程式碼實現講解spring的7種事務傳播機制效果
    • 準備環境
    • 我們採用JDBC+ORACLE實現具體操作,首先搭建好spring的開發環境,配置好資料來源,建立好Test
    • 建立資料庫結構,建立一個使用者表和Book表
      1. CREATE TABLE T_USER(  
      2.     ID INT,  
      3.     NAME VARCHAR2(200)  
      4. );  
      5. CREATE TABLE T_BOOK(  
      6.     ID INT ,  
      7.     NAME VARCHAR2(200)  
      8. );  
       
    • 搭建好的結構如下


    •  
      1. <!-- 定義資料來源 -->  
      2. <bean id="ams" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
      3.         destroy-method="close">  
      4.         <property name="driverClass" value="${jdbc.ams.driver}" />  
      5.         <property name="jdbcUrl" value="${jdbc.ams.url}" />  
      6.         <property name="user" value="${jdbc.ams.username}" />  
      7.         <property name="password" value="${jdbc.ams.password}" />  
      8.         <property name="initialPoolSize" value="${initialSize}" />  
      9.         <property name="minPoolSize" value="${minPoolSize}" />  
      10.         <property name="maxPoolSize" value="${maxActive}" />  
      11.         <property name="acquireIncrement" value="${acquireIncrement}" />  
      12.         <property name="maxIdleTime" value="${maxIdleTime}" />  
      13.     </bean>  
      14. <!-- 定義jdbc模板類-->   
      15. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
      16.         <property name="dataSource" ref="ams"/>  
      17. </bean>  
       
  • 在spring包下面建立3個service
  • BookService
    1. package com.zx.spring;  
    2. import org.springframework.jdbc.core.JdbcTemplate;  
    3. public class BookService {  
    4.     public static final String ADD_BOOK="insert into t_book(id,name) values(1,'duck-j2ee')";  
    5.     private JdbcTemplate jdbcTemplate;  
    6.     public void addBook() throws Exception{  
    7.         this.jdbcTemplate.execute(ADD_BOOK);  
    8.         throw new RollbackException("跳出執行");  
    9.     }  
    10.     public JdbcTemplate getJdbcTemplate() {  
    11.         return jdbcTemplate;  
    12. 相關推薦

      spring事務傳播機制例項講解

      對於SQL事務的概念以及ACID性質,可以參見我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011spring的管理的事務可以分為如下2類: 邏輯事務   在spring中定義的事務通常指邏輯事務,提供比物理事

      Spring 事務傳播機制

      簡述: spring的事務傳播(transaction propagation)分為 REQUIRED SUPPORTED NOT_SUPPORTED REQUIRES_NEW MANDATORY NEVER NESTED PROPAGATION_NESTED

      資料庫事務的四大特性以及事務的隔離級別-與-Spring事務傳播機制&隔離級別 資料庫事務的四大特性以及事務的隔離級別

      資料庫事務的四大特性以及事務的隔離級別     本篇講訴資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。   如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴ 原子性(Atomicity)

      數據庫事務的四大特性以及事務的隔離級別-與-Spring事務傳播機制&隔離級別

      獨立 mys class nag epo 順序執行 catch 再次 重復   本篇講訴數據庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。   如果一個數據庫聲稱支持事務的操作,那麽該數據庫必須要具備以下四個特性: ⑴ 原子性(Atomici

      Spring事務傳播機制(比較詳細)

      文章一: 我們都知道事務的概念,那麼事務的傳播特性是什麼呢?(此處著重介紹傳播特性的概念,關於傳播特性的相關配置就不介紹了,可以檢視spring的官方文件)  在我們用SSH開發專案的時候,我們一般都是將事務設定在Service層 那麼當我們呼叫Service層的一個方法的時候它能夠保

      spring 事務傳播行為例項分析

      Spring事務傳播行為: spring特有的事務傳播行為,spring支援7種事務傳播行為,確定客戶端和被呼叫端的事務邊界(說得通俗一點就是多個具有事務控制的service的相互呼叫時所形成的複雜的事務邊界控制)下圖所示為7鍾事務傳播機制 o    傳播行

      Spring事務傳播機制

      使用AOP 代理後的方法呼叫執行流程,如圖所示 也就是說我們首先呼叫的是AOP代理物件而不是目標物件,首先執行事務切面,事務切面內部通過TransactionInterceptor環繞增強進行事務的增強,即進入目標方法之前開啟事務,退出目標方法時提交/回滾事務。

      資料庫事務的四大特性以及事務的隔離級別-與-Spring事務傳播機制&隔離級別

        本篇講訴資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。   如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴ 原子性(Atomicity)   原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此

      2.2 REQUIRES_NEW不起作用導致整個事務回滾——Spring事務傳播機制

      1、Propagation.REQUIRES_NEW的作用假設有個物件A,有a()方法,有個物件B,有b()方法。在a方法中呼叫了b方法,b方法被稱為內嵌事務,不管a方法是否開啟事務,只要b方法的事務的

      Spring事務傳播特性例項解析

      背景介紹        目前系統正在進行程式碼重構前期預研工作,目標採用spring控制事務以減少開發程式碼量,提高開發效率。同時避免開發人員編碼控制事務所帶來的連結沒有釋放,事務沒有提交,出現異常事務沒有回滾的Bug。      為保證系統能正確使用Spring控制事務,

      REQUIRES_NEW不起作用導致整個事務回滾——Spring事務傳播機制

      1、Propagation.REQUIRES_NEW的作用假設有個物件A,有a()方法,有個物件B,有b()方法。在a方法中呼叫了b方法,b方法被稱為內嵌事務,不管a方法是否開啟事務,只要b方法的事務的隔離級別為REQUIRES_NEW,則一定會在呼叫b方法時產生一個新的事務

      Spring事務傳播機制小記

      前言 之前對spring的事務傳播機制沒有概念,花點時間去看了事務的原始碼,以及這些事務傳播機制使用的文件,在此做一下簡單的筆記 正文 下面說提到的共享事務的意思就是幾個service共用同一個事務,如傳播機制Propagation.REQUIRED 從

      Spring的七種事務傳播機制

      詳細 class support 繼續 tar 傳播行為 類型 情況 隔離 概述 當我們調用一個基於Spring的Service接口方法(如UserService#addUser())時,它將運行於Spring管理的事務環境中,Service接口方法可能會在內部調用其它的S

      spring事務傳播機制

      前言: Spring預設情況下會對執行期發生的異常(RunTimeException),即uncheck異常,進行事務回滾。如果遇到checked異常就不回滾。 不過也可以自定義: 1. 讓checked也回滾:在整個方法前加上 @Transactional(rol

      Spring】原創 深入理解Spring兄弟事務傳播機制

      Spring事務傳播機制    開啟事務的傳播機制 建立兩個方法,這個Service類是被spring容器所掃描的。在該方法上新增@Trancational事務註解。 在insertStudent2()方法上新增上propagation_Require

      Spring事務機制

      pri 異常捕獲 for cep 顯式 nbsp class transacti .class 默認spring事務只在發生未被捕獲的 runtimeexcetpion時才回滾。 spring aop 異常捕獲原理:被攔截的方法需顯式拋出異常,並不能經任何處理,這樣ao

      什麽是事務事務特性、事務隔離級別、spring事務傳播特性

      ons pri table 產生 serializa support enc 不一致 修改 1.什麽是事務: 事務是程序中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性(要麽成功,要麽失敗)。 2.事務特性: 事務特性分為

      理解 spring 事務傳播行為與數據隔離級別

      spa 之間 項目 ext 基本 lock bbb 事務管理 only 事務,是為了保障邏輯處理的原子性、一致性、隔離性、永久性。 通過事務控制,可以避免因為邏輯處理失敗而導致產生臟數據等等一系列的問題。 事務有兩個重要特性: 事務的傳播行為 數據隔離級別 1、事務傳播

      spring事務傳播性理解

      code 捕獲 就會 拋出異常 事務 支持 tro 復制代碼 區分 什麽是spring的事務傳播性 個人的理解, 首先先說一下事務傳播性,事務傳播性就是,事務中還包括另外的事務,事務之間是怎麽相互影響,然後如何執行的,這就是事務傳播性 spring事務傳播性就是spring

      Spring事務傳播

      滿足 工作 後者 作用 測試 nal wired 超時 時機 事務特性 事務有四大特性,分別如下: 1. 原子性(Atomicity):事務是數據庫邏輯工作單元,事務中包含的操作要麽都執行成功,要麽都執行失敗。 2. 一致性(Consistency):事務執行的結果必