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