Spring事務操作

什麼是事務

事務是數據庫操作的最基本單元,邏輯上一組操作,要麼都成功,如果有一個失敗所有操作都失敗。

  • 要麼都成功,要麼都失敗
  • 事務在項目開發中,十分的重要,涉及到數據的一致性問題,不能馬虎
  • 確保完整性和一致性

事務ACID原則:

  • 原子性:要麼都成功,要麼都失敗
  • 一致性:事務前後數據的完整性必須保持一致
  • 隔離性:事務的隔離性是多個用戶併發訪問數據庫時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作數據所幹擾,多個併發事務之間要相互隔離
    • 多個業務可能操作多個資源,防止數據損壞。
  • 持久性:指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響
    • 事務一旦提交,無論系統發生什麼問題,結果都不會被影響。數據被持久化的寫到存儲器中

Spring事務操作

  1. 事務添加到 JavaEE 三層結構裏面 Service 層(業務邏輯層)

  2. 在 Spring 進行事務管理操作

    1. 有兩種方式:編程式事務管理聲明式事務管理(使用)
  3. 聲明式事務管理

    1. 基於註解方式(使用
    2. 基於 xml 配置文件方式
  4. 在 Spring 進行聲明式事務管理,底層使用 AOP 原理

  5. Spring 事務管理 API

    1. 提供一個接口,代表事務管理器,這個接口針對不同的框架提供不同的實現類

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-D0g9k8xL-1593876952224)(Spring.assets/image-20200703170417739.png)]

Spring事務操作(基於註解操作聲明式事務)

  1. 在 spring 配置文件配置事務管理器

    <!--    配置聲明式事務-->
        <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--        注入數據源-->
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
    <!--    開啓事務的註解-->
        <tx:annotation-driven transaction-manager="TransactionManager"/>
    
  2. 在 service 類上面(或者 service 類裏面方法上面)添加事務註解

    1. @Transactional,這個註解添加到類上面,也可以添加方法上面
    2. 如果把這個註解添加類上面,這個類裏面所有的方法都添加事務
    3. 如果把這個註解添加方法上面,爲這個方法添加事務
@Service("UserService")
@Transactional//配置傳播行爲,設置隔離級別
public class UserServiceImpl implements UserService{
}
  1. 運行測試:

    在這裏插入圖片描述

    此時,經過事務的處理,出現異常的時候,回滾到之前的操作,存款金額沒發生變化。

事務操作(聲明式事務管理參數配置)

  1. 在 service 類上面添加註解@Transactional,在這個註解裏面可以配置事務相關參數
    在這裏插入圖片描述

  2. propagation:事務傳播行爲

    1. 多事務方法直接進行調用,這個過程中事務 是如何進行管理的

      在這裏插入圖片描述

      add()有事務,但是update()沒有事務。如果add調用update()方法,事務該如何傳播?

      1. Spring定義了7種類傳播行爲
        在這裏插入圖片描述
  3. ioslation:事務隔離級別

    1. 事務有特性稱爲隔離性,多事務操作之間不會產生影響。不考慮隔離性產生很多問題

    2. 有三個讀問題:髒讀、不可重複讀、幻讀

    3. ==髒讀:==一個未提交的事務讀取到另一個未提交事務的數據

      1. A事務讀取B事務尚未提交的數據,此時如果B事務發生錯誤並執行回滾操作,那麼A事務讀取到的數據就是髒數據。
    4. ==不可重複讀:==一個未提交事務讀取到另一提交事務修改數據(前後多次讀取,數據內容不一致

    5. ==幻讀:==事務A在執行讀取操作,需要兩次統計數據的總量,前一次查詢數據總量後,此時事務B執行了新增數據的操作並提交後,這個時候事務A讀取的數據總量和之前統計的不一樣,就像產生了幻覺一樣,平白無故的多了幾條數據,成爲幻讀。

      1. 幻讀可以通過增加版本號來控制
    6. 解決辦法:通過設置事務的隔離級別,解決讀的問題。
      在這裏插入圖片描述

  4. timeout:超時時間

    1. 事務需要在一定時間內進行提交,如果不提交進行回滾
    2. 默認值是 -1 ,設置時間以秒單位進行計算
  5. readOnly:是否只讀

    1. 讀:查詢操作,寫:添加修改刪除操作
    2. readOnly 默認值 false,表示可以查詢,可以添加修改刪除操作
    3. 設置 readOnly 值是 true,設置成 true 之後,只能查詢
  6. rollbackFor:回滾

    1. 設置出現哪些異常進行事務回滾
  7. noRollbackFor:不回滾

    1. 設置出現哪些異常不進行事務回滾
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章