1. 程式人生 > 資訊 >309 元,小米中樞閘道器今日開啟眾籌:全新本地中樞架構,可連線百款裝置

309 元,小米中樞閘道器今日開啟眾籌:全新本地中樞架構,可連線百款裝置

8、宣告式事務

8.1、事務ACID原則

參考萬里顧—程的部落格

  • 原子性(atomicity)
    • :事務中包括的操作要麼都做,要麼都不做
  • 一致性 (consistency)
    • :針對一個事務操作前與操作後的狀態一致
  • 隔離性(isolation)
    • :一個事務的執行不能被其他事務干擾
    • 造成的問題:
      1. 髒讀:指一個事務讀取了另外一個事務未提交的資料
      2. 不可重複讀:在一個事務內讀取表中的某一行資料,多次讀取結果不同(資料內容不一致)
      3. 幻讀:是指在一個事務內讀取到了別的事務插入的資料,導致前後讀取到的資料不一致
  • 永續性 (durability)
    • :指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的,不可逆的
      1. 如果在操作之前(事務還沒有提交)伺服器宕機或者斷電,那麼重啟資料庫之後,資料狀態還是操作之前的,恢復到原狀
      2. 如果在操作後(事務已經提交)伺服器宕機或者斷電,那麼重啟資料庫之後,資料狀態應為操作之後的,持久化到資料庫

8.2、spring中配置宣告式事務

  • 配置宣告事務

        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
  • 結合AOP實現事務的織入

  • 配置事務通知

        <tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
            <tx:attributes>
    <!--     需要開啟事務訂單方法       -->
    <!--            傳播特性 propagation 預設是REQUIRED-->
    <!--            read-only="true"表只讀事務-->
                <tx:method name="queryAllUser" propagation="REQUIRED"/>
                <tx:method name="deleteUserById" propagation="REQUIRED"/>
                <tx:method name="addUser" propagation="REQUIRED"/>
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
    
    • propagation

      傳播行為(PROPAGATION) 描述
      PROPAGATION_REQUIRED 如果當前沒有事務,就新建一個事務,如果已存在一個事務中,加入到這個事務中,這是最常見的選擇。
      PROPAGATION_SUPPORTS 支援當前事務,如果沒有當前事務,就以非事務方法執行
      PROPAGATION_MANDATORY 使用當前事務,如果沒有當前事務,就丟擲異常
      PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起
      PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起
      PROPAGATION_NEVER 以非事務方式執行操作,如果當前事務存在則丟擲異常
      PROPAGATION_NESTED 如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED 類似的操作

      原文連結:https://blog.csdn.net/zhangsweet1991/article/details/83897211

  • 事務的切入 ,我用的這個版本spring開啟事務的時候需要把proxy-target-class="true"開啟cglib的方式

    <!--    - 事務的切入-->
        <aop:config proxy-target-class="true">
            <aop:pointcut id="txPointcut" expression="execution(* com.mhy.mapper.*.*(..))"/>
            <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="txPointcut"/>
        </aop:config>