Spring理論--Spring事務相關速記

Spring理論--Spring事務相關速記

數據庫事務

事務特性:

  1. 原子性,事務是不可分割的最小工做單元,事務內的操做要麼全作,要麼全不作
  2. 一致性,在事務執行前數據庫的數據處於正確的狀態,而事務執行完成後數據庫的數據仍是處於正確的狀態
  3. 隔離性,併發事務執行之間無影響,在一個事務內部的操做對其餘事務是不產生影響,這須要事務隔離級別來指定隔離性
  4. 持久性,事務一旦執行成功,它對數據庫的數據的改變必須是永久的,不會形成數據不一致或丟失

數據庫常見問題:

  1. 髒讀:一個事務看到了另外一個事務未提交的更新數據
  2. 不可重複讀:在同一事務中,屢次讀取同一數據卻返回不一樣的結果;也就是有其餘事務更改了這些數據
  3. 幻讀:一個事務在執行過程當中讀取到了另外一個事務已提交的插入數據;即在第一個事務開始時讀取到一批數據,但此後另外一個事務又插入了新數據並提交,此時第一個事務又讀取這批數據但發現多了一條,即好像發生幻覺同樣。

數據庫隔離級

  1. 未提交讀(RU Read Uncommitted):最低隔離級別,一個事務能讀取到別的事務未提交的更新數據,很不安全,可能出現髒讀、不可重複讀、幻讀
  2. 提交讀(RC Read Committed):一個事務能讀取到別的事務提交的更新數據,不能看到未提交的更新數據,不會出現髒讀,但可能出現不可重複讀、幻讀
  3. 可重複讀(RR Repeatable Read):保證同一事務中前後執行的屢次查詢將返回同一結果,不受其餘事務影響,不會出現髒讀、不可重複讀,但可能出現幻讀;
  4. 序列化(Serializable):最高隔離級別,不容許事務併發執行,而必須串行化執行,最安全,不會出現髒讀、不可重複讀、幻讀。

Spring提供的事務管理

Spring框架最核心功能之一就是事務管理,Spring支持聲明式事務和編程式事務事務類型,這能幫助咱們:java

  1. 提供一致的編程式事務管理API,無論使用Spring JDBC框架仍是集成第三方框架使用該API進行事務編程;
  2. 無侵入式的聲明式事務支持。

Spring框架支持事務管理的核心是事務管理器抽象,經過定義接口 PlatformTransactionManager 讓不一樣數據訪問框架來實現,mysql

public interface PlatformTransactionManager {  
       TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;  
       void commit(TransactionStatus status) throws TransactionException;  
       void rollback(TransactionStatus status) throws TransactionException;  
}

getTransaction():返回一個已經激活的事務或建立一個新的事務(根據給定的TransactionDefinition類型參數定義的事務屬性),返回的是TransactionStatus對象表明了當前事務的狀態,其中該方法拋出TransactionException(未檢查異常)表示事務因爲某種緣由失敗。
commit():用於提交TransactionStatus參數表明的事務
rollback():用於回滾TransactionStatus參數表明的事務spring

TransactionDefinition接口sql

public interface TransactionDefinition {  
       int getPropagationBehavior();  
       int getIsolationLevel();  
       int getTimeout();  
       boolean isReadOnly();  
       String getName();  
}
  • getPropagationBehavior():返回定義的事務傳播行爲;
  • getIsolationLevel():返回定義的事務隔離級別;
  • getTimeout():返回定義的事務超時時間;
  • isReadOnly():返回定義的事務是不是隻讀的;
  • getName():返回定義的事務名字。

事務傳播行爲

  • PROPAGATION_REQUIRED 支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。
  • PROPAGATION_SUPPORTS 支持當前事務,若是當前沒有事務,就以非事務方式執行。
  • PROPAGATION_MANDATORY 支持當前事務,若是當前沒有事務,就拋出異常。
  • PROPAGATION_REQUIRES_NEW 新建事務,若是當前存在事務,把當前事務掛起。
  • PROPAGATION_NOT_SUPPORTED 以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
  • PROPAGATION_NEVER 以非事務方式執行,若是當前存在事務,則拋出異常。

編程式事務

配置文件數據庫

<bean id="dataSource" parent="dataSourceParent">
        <property name="url" value="jdbc:mysql://dbm.***.me:3306" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
    </bean>
        <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
DefaultTransactionDefinition def = new DefaultTransactionDefinition();  
    def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);  
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);  
    TransactionStatus status = txManager.getTransaction(def);  
    jdbcTemplate.execute(CREATE_TABLE_SQL);  
    try {  
        jdbcTemplate.update(INSERT_SQL, "test");  
        txManager.commit(status);  ![](http://images2015.cnblogs.com/blog/1071030/201706/1071030-20170608143321590-1214373007.png)


    } catch (RuntimeException e) {  
        txManager.rollback(status);  
    }

聲明式事務

<tx:advice id="txAdvice" transaction-manager="txManager">  
    <tx:attributes>  
        <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/>  
        <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="true"/>  
    </tx:attributes>  
</tx:advice>  

<aop:config>
    <aop:pointcut id="daoMethod" expression="execution(* com.dao.*.*(..))"/>
    <aop:advisor pointcut-ref="daoMethod" advice-ref="txadvice"/>
</aop:config>
  • 事務通知定義,用於指定事務屬性,其中「transaction-manager」屬性指定事務管理器,並經過指定具體須要攔截的方法;
  • 切入點定義 其中第一個表明返回值,第二表明dao下子包,第三個*表明方法名,「(..)」表明方法參數。
  • Advisor定義,其中切入點爲daoMethod,通知爲txAdvice。

不能被事務加強的方法

相關文章
相關標籤/搜索