資料庫的四大特性以及事務的隔離級別,七種傳播行為
資料庫的四大特性:
1.原子性
2.一致性
3.隔離性
4.永續性
其中不考慮事務的隔離性會出現下面幾種情況:
(1)髒讀
在一個事務處理過程裡讀取了另一個未提交的事務中的資料。
當一個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這時一個併發的事務來訪問該資料,就會造成兩個事務得到的資料不一致。
(2)不可重複讀
讀取了已提交的事務。事務A讀取資料後,事務執行更新操作,使A無法再現前一次讀取結果。不可重複讀包括三種情況:
A)事務A讀取某一資料後,事務B對其作了修改,當事務A再次讀取該事物時,得到與前一次不同的值。
B)事務A按一定條件從資料庫中讀取某資料記錄後,事務B刪除了其中部分記錄,當A再次按相同條件讀取資料時,發現某些記錄神祕的消失了。
C)事務A按一定條件從資料庫中讀取某資料記錄後,事務B插入了一些記錄,當A再次按相同條件讀取資料時,發現、多了一些記錄。
後兩種不可重複讀,也稱為幻影(Phantom Row)現象。
(3)丟失修改
兩個事物A與B,讀入同一資料並修改,B提交的結果破壞了A提交的結果,導致A的修改丟失。
(4)幻讀(由於設定事務隔離級別為:可重複讀,而導致)
同一事務中,雖然多次執行相同的查詢,查詢結果是相同的。但後面的查詢結果已經與DB中真正的資料不一致了。在同一事務中多次讀取到的資料,不是真實的DB中當前資料,是虛的資料,就像是DB中資料的幻象。
事務的隔離級別:
1.Serializable (序列化)
2.Repeatable read (可重複讀):可避免髒讀、不可重複讀。
3.Read committed (讀已提交):可避免髒讀。
4.Read uncommitted (讀未提交):都避免不了
MySQL預設的方式的:可重複讀。
七種傳播行為:
1.PROPAGATION_REQUIRED:(支援事務)如果當前沒有事務,就建立一個新事務,如果當前存在事務,就加入該事務,該設定是最常用的設定。
2.PROPAGATION_SUPPORTS:(支援事務)支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。
3.PROPAGATION_MANDATORY:(支援事務)支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就丟擲異常。
4.PROPAGATION_REQUIRES_NEW:(支援事務)建立新事務,無論當前存不存在事務,都建立新事務。
5.PROPAGATION_NOT_SUPPORTED:(不支援事務)以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
6.PROPAGATION_NEVER:(不支援事務)以非事務方式執行,如果當前存在事務,則丟擲異常。
7.PROPAGATION_NESTED:(不支援事務)如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。