1. 程式人生 > 其它 >Spring事務知識點(總結)

Spring事務知識點(總結)

  1. 什麼是事務

    答:既是把操作一次資料庫的這個操作當成是一個事務,把這個行為抽象了。

    例如:查詢一次user表的所有內容叫一次事務。

  2. 事務的4大特性(ACID):

    • 原子性(Atomicity):一個事務內的操作,要麼全部執行成功,要麼全部不成功。
    • 一致性(Consistency):事務執行後,資料庫狀態與其他業務規則保持一致。如轉賬業務,無論事務執行成功與否,參與轉賬的兩個賬號餘額之和應該是不變的。
    • 隔離性(Isolation):每個事務獨立執行。在併發環境中,併發的事務是互相隔離的,互不影響。
    • 永續性(Durability):事務一旦提交後,資料庫中的資料必須被永久地儲存下來。

  3. 事務的4大隔離級別:

    通過一個轉賬系統做分析:

    • READ_UNCOMMITTED

      已讀但未提交,即一個事務讀取到了另一個事務未提交的資料。在這種隔離級別下,會造成“髒讀”的情況。如下表

      事務A存款 事務B取款
      事務A開始 ----
      ---- 事務B開始
      ---- 事務B查詢餘額(10元)
      ---- 事務B取出10元(0元)
      事務A查詢餘額(0元) ----
      ---- 事務B撤銷(10元)
      事務A存款10元(10元) ----
      事務A提交(更新餘額:10元) ----

      正常情況下,A、B兩事務執行完以後,賬戶餘額應為20元,但是在時刻T5時,事務A查詢到的餘額為0元,這是因為讀取到了事務B未提交的資料,即讀到了“髒”資料。

    • READ_COMMITTED

      在這個隔離級別下,可以有效避免“髒讀”情況的發生。雖然解決了不可重複讀的問題,但是在這個隔離級別下無法避免不可重複讀取的問題。在READ_COMMITTED隔離級別下,可能會出現如表13-2所示的場景。如下表

      事務A查詢 事務B取款
      事務A開始 ----
      ---- 事務B開始
      ---- 事務B查詢餘額(10元)
      事務A查詢(10元)
      ---- 事務B取出10元(0元)
      ---- 事務B提交(更新餘額:0元)
      事務A查詢(0元) ----
      事務A提交 ----

      事務A執行了兩次餘額查詢,但第一次查詢得到的餘額是10元,第二次查詢得到的餘額為0元,這就是不可重複讀取的問題。

    • REPEATABLE_READ

      可重複讀級別是保證在事務處理過程中多次讀取同一個資料時的值始終是一致的。可重複讀取是通過在事務開啟後不允許其他事務對當前記錄進行修改操作實現的。
      這個隔離級別避免了“髒讀”和不可重複讀的問題,但是有可能會出現“幻讀”。“幻讀”場景的出現。如下表

      事務A查詢 事務B存款款
      事務A開始 ----
      ---- 事務B開始
      事務A查詢 ----
      ---- 事務B存入10元
      ---- 事務B提交
      事務A查詢 ----
      事務A提交 ----

      在事務A中,同一個事務多次獲取交易記錄,發現第二次獲取交易記錄的結果中多出了一筆存款記錄——事務B發生的存款操作,對事務A來說,好像是出現了幻覺一樣,即“幻讀”。

    • SERIALIZABLE

      順序讀是最嚴格的事務隔離級別。它要求所有的事務排隊依序執行,即事務只能一個接一個地處理,不能併發執行。

    • Spring還有一種預設既是根據資料的事務來決定自己的事務

    • 4種事務隔離級別從上往下,級別越高,併發性越差,但安全性越來越高。

      事務隔離級別 髒讀 重複讀 幻讀
      READ_UNCOMMITTED 允許 允許 允許
      READ_COMMITTED 不允許 允許 允許
      REPEATABLE_READ 不允許 不允許 允許
      SERIALIZABLE 不允許 不允許 不允許
  4. 事務的7中傳播途徑

    答:事務傳播行為是用來描述由某一個事務傳播行為修飾的方法被巢狀進另一個方法的時候。

    舉例子:

    • 首先查詢剩餘餘額算成一個事務

    • 接著定義取款事務

      取款之前先呼叫查詢事務

      這個過程就叫事務的傳播