1. 程式人生 > >Spring 事務傳播與隔離級別描述

Spring 事務傳播與隔離級別描述

一. 傳播 : 描述在當前情況條件下,後續的事或物是以何種狀態或行為去呈現。

 

    思考情況 : (有與無)

         1)以事務執行
               條件1 : 當前有事務時,後續如何。

               條件2: 當前無事務時,後續如何。

         2)以無事務執行

              

   事務傳播 -> 

         PROPAGATION_REQUIRED : 

                   情況1(當前有事務) : 後續全部加入此事務。

                   情況2(當前無事務) : 則新建事務,後續全部加入此事務。

 

         PROPAGATION_REQUIRES_NEW : 

                   情況1(當前有事務) : 則掛起當前事務,後續全部新建事務。每個事務相互獨立互不干擾,發生異常時不影響其他的事務。

                   情況2(當前無事務) : 則新建事務,後續也全部建立新事務。每個事務相互獨立互不干擾,發生異常時不影響其他的。

 

         PROPAGATION_SUPPORTS : 

                   情況1(當前有事務) : 後續則全部加入此事務。

                   情況2(當前無事務) : 後續則已無事務進行處理。

 

         PROPAGATION_MANDATORY : 

                   情況1(當前有事務) : 後續則全部加入此事務。

                   情況2(當前無事務) : 後續則丟擲異常。

         

         PROPAGATION_NOT_SUPPORTED:

                   情況1(當前有事務) : 則掛起當前事務,後續已無事務進行處理。  

                   情況2(當前無事務) : 後續正常處理。  

          

         PROPAGATION_NEVER : 

                   情況1(當前有事務) : 非事務處理方式,後續則拋異常。

                   情況2(當前無事務) : 後續正常處理。

 

         PROPAGATION_NESTED : (只對DataSourceTransactionManager事務管理器起效) 

                   情況1(當前有事務) : 後續則以巢狀事務的方式,新建一個事務。擁有多個可以回滾的儲存點,內部事務的回滾不會對外部事務造成影響。

                   情況2(當前無事務) : 則按REQUIRED屬性執行,新建一個事務,後續則按有事務的方式進行處理。

 

二. 事務隔離級別 : 

 

         1)思考內容  : 多個事務同時讀寫同一條資料或同一批資料時的情況。

         

         2)基本詞語概括思考內容會發生的情況 : 

                 情況1 : 事務A 讀取了 事務B未提交的資料(假設事務B出現異常未繼續提交或發生回滾,則資料是無用的) , 此情況簡稱 -- 髒讀。

 

                 情況2  : 事務A發生兩次讀取某條記錄,第一次該欄位某個欄位值為a,然後事務B修改了該欄位值為b,接著事務A第二次讀取該欄位的值為b, 此情況簡稱 -- 不可重複讀(該情況不是絕對性是屬於錯誤的,按業務需求而定)。

 

                 情況3: 事務A發生兩次讀取一批資料(根據範圍查詢多條資料),根據條件第一次讀取了10條資料,然後事務B在此範圍資料中刪除了1(N)條資料或新增了1條(N)資料,接著事務A讀取到9條(N)資料或11條(N)資料 -- 此情況簡稱 -- 幻讀。

 

 

        3)資料庫設定的隔離級別 ->

 

                   級別0 : Read uncommitted(未提交讀) -> 上訴3種情況都可能發生。

                   級別1  : Read committed(已提交讀)   ->   可避免情況1,情況2,3可能發生。

                   級別2 : Repeatable read (可重複讀) -> 可避免情況1,2,情況3可能發生。

                   級別3 : Serializable(可序列化) ->  最高級別可避免情況1,2,3情況。

 

    其中mysql預設隔離級別是 級別 -> Repeatable read。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

&nb