Spring事務知識點

事務的傳播屬性

  • PROPAGATION_REQUIRED
    若是當前沒有事務,就新建一個事務,若是已經存在一個事務中,加入到這個事務中。// 最經常使用,@Transactional註解默認mysql

  • PROPAGATION_REQUIRES_NEW
    新建事務,若是當前存在事務,把當前事務掛起。spring

  • PROPAGATION_SUPPORTS
    支持當前事務,若是當前沒有事務,就以非事務方式執行。sql

  • PROPAGATION_NOT_SUPPORTED
    以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。數據庫

  • PROPAGATION_MANDATORY
    使用當前的事務,若是當前沒有事務,就拋出異常。性能

  • PROPAGATION_NEVER
    以非事務方式執行,若是當前存在事務,則拋出異常。code

  • PROPAGATION_NESTED
    若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行與PROPAGATION_REQUIRED相似的操做。事務

事務的隔離級別

  • DEFAULT(默認)
    使用數據庫默認的事務隔離級別。ci

  • READ_UNCOMMITTED(讀未提交)
    事務最低的隔離級別,它容許另一個事務能夠看到這個事務未提交的數據;
    會產生髒讀,不可重複讀和幻讀。it

  • READ_COMMITTED(讀已提交)
    保證一個事務修改的數據提交後才能被另一個事務讀取,另一個事務不能讀取該事務未提交的數據;
    避免出現髒讀,但可能會出現不可重複讀和幻讀。io

  • REPEATABLE_READ(可重複讀)
    保證一個事務不能讀取另外一個事務未提交的數據外,保證不可重複讀 ;
    避免出現髒讀、不可重複讀,但可能出現幻讀;

  • SERIALIZABLE(串行化)
    事務被處理爲順序執行;
    避免出現髒讀、不可重複、幻讀;
    性能代價最高,可是最可靠的事務隔離級別。

@Transactional註解

package org.springframework.transaction.annotation;

public @interface Transactional {

    @AliasFor("transactionManager")
    String value() default "";

    @AliasFor("value")
    String transactionManager() default "";

    Propagation propagation() default Propagation.REQUIRED;

    Isolation isolation() default Isolation.DEFAULT;

    int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

    boolean readOnly() default false;

    Class<? extends Throwable>[] rollbackFor() default {};

    String[] rollbackForClassName() default {};

    Class<? extends Throwable>[] noRollbackFor() default {};

    String[] noRollbackForClassName() default {};
}

可見:
事務的傳播方式默認爲PROPAGATION_REQUIRED,即當前沒有事務則新建事務,有事務則加入當前事務;
隔離級別默認爲DEFAULT默認,即便用數據庫默認的事務隔離級別。

MySQL事務

查看版本:SELECT @@version
查看事務隔離級別:SELECT @@tx_isolation

以MySQL5.5爲例:
SELECT @@version => 5.5.56
SELECT @@tx_isolation => REPEATABLE-READ


事務的基本要素(ACID)

  1. 原子性(Atomicity):事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。

  2. 一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比A向B轉帳,不可能A扣了錢,B卻沒收到。

  3. 隔離性(Isolation):同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。

  4. 持久性(Durability):事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。

事務的隔離特性

  1. 髒讀:事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據

  2. 不可重複讀:事務A屢次讀取同一數據,事務B在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。

  3. 幻讀:系統管理員A將數據庫中全部學生的成績從具體分數改成ABCDE等級,可是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺同樣,這就叫幻讀。
    注: 不可重複讀側重於修改,幻讀側重於新增或刪除; 解決不可重複讀的問題只需鎖住知足條件的行; 解決幻讀須要鎖表。

相關文章
相關標籤/搜索