轉-spring源碼-事務

轉自:
https://www.cnblogs.com/zwt1990/p/7096492.html

spring的傳播特性:
PROPAGATION_REQUIRED,
PROPAGATION_SUPPORTS,
PROPAGATION_MANDATORY,
PROPAGATION_REQUIRES_NEW,
PROPAGATION_NOT_SUPPORTED,
PROPAGATION_NEVER, PROPAGATION_NESTED

我們來介紹下:

    class A{
        methodA(){
            //邏輯處理
            b.methodB();
            //邏輯處理
        }
    }
    class B{
        methodB();
    }

  1.PROPAGATION_REQUIRED:如果存在一個事務,則支持當前事務。如果沒有事務則開啓

  解釋:當A.methodA()和B.methodB()都打上REQUIRED的事務標誌,執行A.methodA()方法的時候,看到上下文沒有事務,會新建一個事務,當執行到b.methodB()的時候,發現上下文已經有事務了,則不會新建事務,用A.methodA()新建的那個事務。

  如果b.methodB()執行成功,a.methodA()執行失敗,那麼b.methodB()和a.methodA()都會回滾(用的都是a.methodA()的事務)

  2.PROPAGATION_SUPPORTS:如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行

  解釋:當B.methodB()打上PROPAGATION_SUPPORTS的事務標誌,執行A.methodA()方法,當執行到b.methodB()的時候,會檢查上下文有沒有事務,如果A.methodA()有事務,則b.methodB()沿用該事務,反之b.methodB()就以非事物的方式執行

  3.PROPAGATION_MANDATORY:如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常

  解釋:當B.methodB()打上PROPAGATION_MANDATORY的事務標誌,執行A.methodA()方法,當執行到b.methodB()的時候,會檢查上下文有沒有事務,如果A.methodA()有事務,則b.methodB()沿用該事務,如果沒有,則會拋出異常

  4.PROPAGATION_REQUIRES_NEW:總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起

  解釋:當B.methodB()打上PROPAGATION_REQUIRES_NEW的事務標誌,執行A.methodA()方法,當執行到b.methodB()的時候,會檢查上下文有沒有事務,如果A.methodA()有事務,則會掛起A.methodA()的事務,新建一個屬於b.methodB(),當b.methodB()

  的事務執行結束的時候,則會喚醒b.methodB()的事務。和PROPAGATION_REQUIRED的差別在於回滾,當b.methodB()的事務提交後,A.methodA()執行失敗,只會回滾A.methodA不會回滾b.methodB(),當b.methodB()執行失敗,異常被A.methodA()方法  

   catch到的話,A.methodA()事務不會回滾

  5.PROPAGATION_NOT_SUPPORTED:總是非事務地執行,並掛起任何存在的事務

  解釋:當B.methodB()打上PROPAGATION_NOT_SUPPORTED的事務標誌,執行A.methodA()方法,當執行到b.methodB()的時候,會檢查上下文有沒有事務,如果A.methodA()有事務,則會掛起A.methodA()的事務,當執行完b.methodB()方法的時候,   A.methodA()方法繼續以事務的方式執行

  6.PROPAGATION_NEVER: 總是非事務地執行,如果存在一個活動事務,則拋出異常

  解釋:當B.methodB()打上PROPAGATION_NEVER的事務標誌,執行A.methodA()方法,當執行到b.methodB()的時候,會檢查上下文有沒有事務,如果有事務,則拋出異常,如果沒有則以非事務執行

  7.PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, PROPAGATION_REQUIRED 屬性執行

  解釋:當B.methodB()打上PROPAGATION_NOT_SUPPORTED的事務標誌,執行A.methodA()方法,當執行到b.methodB()的時候,如果A.methodA()方法有事務,則會用當前事務,如果 b.methodB()執行失敗,只會回滾 b.methodB(),不會回滾A.methodA(),   只有當A.methodA()執行完成後纔會提交b.methodB()的事務,如果A.methodA()方法沒有事務,就會新建一個事務;

  事務隔離級別: ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED,ISOLATION_REPEATABLE_READ,ISOLATION_SERIALIZABLE

  1.ISOLATION_DEFAULT:這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別   

  2. ISOLATION_READ_UNCOMMITTED :這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀。

  3. ISOLATION_READ_COMMITTED :保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。:

  4. ISOLATION_REPEATABLE_READ :這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。

  5. ISOLATION_SERIALIZABLE :這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻讀。


第二部分,有圖,不好,貼個鏈接,方便後面學習:

http://www.linkedkeeper.com/detail/blog.action?bid=1045

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章