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(串行化)
事務被處理爲順序執行;
避免出現髒讀、不可重複、幻讀;
性能代價最高,可是最可靠的事務隔離級別。
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默認,即便用數據庫默認的事務隔離級別。
查看版本:SELECT @@version
查看事務隔離級別:SELECT @@tx_isolation
以MySQL5.5爲例:
SELECT @@version => 5.5.56
SELECT @@tx_isolation => REPEATABLE-READ
原子性(Atomicity):事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。
一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比A向B轉帳,不可能A扣了錢,B卻沒收到。
隔離性(Isolation):同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。
持久性(Durability):事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。
髒讀:事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據
不可重複讀:事務A屢次讀取同一數據,事務B在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。
幻讀:系統管理員A將數據庫中全部學生的成績從具體分數改成ABCDE等級,可是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺同樣,這就叫幻讀。
注: 不可重複讀側重於修改,幻讀側重於新增或刪除; 解決不可重複讀的問題只需鎖住知足條件的行; 解決幻讀須要鎖表。