那些年你不能錯過的之【Spring事務】

你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。可柔可剛,點贊則柔,白嫖則剛!web

死鬼~看完記得給我來個三連哦!spring

本文主要介紹 Spring 中的 事務
若有須要,能夠參考
若有幫助,不忘 點贊sql

創做不易,白嫖無義!數據庫

什麼是事務

  • 事務管理是企業級應用程序開發中必不可少的技術, 用來確保數據的完整性和一致性。express

  • 事務就是一系列的動做, 它們被當作一個單獨的工做單元. 這些動做要麼所有完成, 要麼所有不起做用服務器

  • 事務的四個關鍵屬性(ACID)併發

    • 原子性(atomicity)

    事務是一個原子操做, 由一系列動做組成. 事務的原子性確保動做要麼所有完成要麼徹底不起做用app

    • 一致性(consistency)

    一旦全部事務動做完成, 事務就被提交. 數據和資源就處於一種知足業務規則的一致性狀態中框架

    • 隔離性(isolation)

    可能有許多事務會同時處理相同的數據, 所以每一個事物都應該與其餘事務隔離開來, 防止數據損壞性能

    • 持久性(durability)

    一旦事務完成, 不管發生什麼系統錯誤, 它的結果都不該該受到影響. 一般狀況下, 事務的結果被寫到持久化存儲器中

Spring 中的事務管理器的不一樣實現:

  • Class DatasourceTransactionManager: 在應用程序中只須要處理一個數據源, 並且經過 JDBC 存取
  • Class JtaTransactionManager:在 JavaEE 應用服務器上用 JTA(Java Transaction API) 進行事務管理
  • Class HibernateTransactionManager:用 Hibernate 框架存取數據庫

事務的實現

1)用 @Transactional 註解聲明式地管理事務

  • Spring配置文件中聲明:
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 啓用事務註解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
複製代碼
  • 在配置文件中聲明瞭以後咱們能夠用@Transactional註解來標註事務方法
  • 根據 Spring AOP 基於代理機制,只能標註公有方法
  • 能夠在方法或者級別上添加 @Transactional 註解,當把這個註解應用到類上時, 這個類中的全部公共方法都會被定義成支持事務處理的

2)用事務通知聲明式地管理事務

Spring配置文件中聲明:

    <!-- 1. 配置事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean> 
    <!-- 2. 配置事務屬性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 根據方法名指定事務的屬性 -->
            <tx:method name="purchase" propagation="REQUIRES_NEW"/>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    <!-- 3. 配置事務切入點, 以及把事務切入點和事務屬性關聯起來 -->
    <aop:config>
        <aop:pointcut expression="execution(* cbuc.life.tx.xml.service.*.*(..))"
            id="txPointCut"/>

        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>  
    </aop:config>
複製代碼

小菜與你小結

一丶事務傳播屬性

  • 當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播。 例如:方法可能繼續在現有事務中運行, 也可能開啓一個新事務, 並在本身的事務中運行。
  • 事務的傳播行爲能夠由傳播屬性指定,Spring 定義了 7 種類傳播行爲。
  • 咱們能夠在註解 @Transactional 中使用 propagation 指定事務的傳播行爲,也能夠在配置文件中指定

二丶併發事務所致使的問題

  • 當同一個應用程序或者不一樣應用程序中的多個事務在同一個數據集上併發執行時,可能會出現許多意外的問題

  • 併發事務所致使的問題能夠分爲下面三種類型

    1)髒讀

    對於兩個事物 T1, T2,T1 讀取了已經被 T2 更新但 尚未被提交的字段。以後, 若 T2 回滾,T1讀取的內容就是臨時且無效的

    2)不可重複讀

    對於兩個事物 T1, T2,T1 讀取了一個字段, 而後 T2 更新了該字段。以後,T1再次讀取同一個字段,值就不一樣了

    3)幻讀

    對於兩個事物 T1, T2,T1 從一個表中讀取了一個字段,而後 T2 在該表中插入了一些新的行。以後,若是 T1 再次讀取同一個表,就會多出幾行

三丶事務的隔離級別

  • 從理論上來講,事務應該彼此徹底隔離,以免併發事務所致使的問題。然而,那樣會對性能產生極大的影響,由於事務必須按順序運行
  • 在實際開發中, 爲了提高性能, 事務會以較低的隔離級別運行
  • 事務的隔離級別能夠經過隔離事務屬性指定
  • 事務的隔離級別要獲得底層數據庫引擎的支持,而不是應用程序或者框架的支持
  • Oracle 支持的 2 種事務隔離級別:READ_COMMITEDSERIALIZABLE
  • Mysql 支持 4 中事務隔離級別
  • 咱們能夠在註解 @Transactional 中使用isolation指定事務隔離性,也能夠在配置文件中指定

四丶設置回滾事務屬性

  • 默認狀況下只有未檢查異常(RuntimeException)Error類型的異常會致使事務回滾。而受檢查異常則不會
  • 事務的回滾規則能夠經過 @Transactional 註解的 rollbackFornoRollbackFor 屬性來定義,這兩個屬性被聲明爲 Class[] 類型的,所以能夠爲這兩個屬性指定多個異常類
  • 遇到rollbackFor時必須進行回滾 ;而norollbackFor則反之
  • 能夠經過 @Transactional 配置,也能夠在配置文件中配置

五丶設置超時和只讀事務屬性

  • 超時事務屬性:事務在強制回滾以前能夠保持多久,這樣能夠防止長期運行的事務佔用資源
  • 只讀事務屬性:表示這個事務只讀取數據但不更新數據,這樣能夠幫助數據庫引擎優化事務
  • 能夠經過 @Transactional 配置,也能夠在配置文件中配置

看完不讚,都是壞蛋
看完不讚,都是壞蛋

今天的你多努力一點,明天的你就能少說一句求人的話!

我是小菜,一個和你一塊兒學習的男人。 💋

相關文章
相關標籤/搜索