Spring學習11-- 事務管理
一、事務的四個特性
事務包括四個特徵(ACID)
1、原子性(Atomicity):也就是說事務中的操作必須要保證是原子性的,不可再分的,意思就是說,一步失敗,則全部失敗,全部成功,才算成功。
2、一致性(Consistency):事務一旦完成,則必須保證,事務內的業務是一致的,不可能出現一部分成功的情況。現實中,資料也應該不被破壞。
3、隔離性(Isolation):事務通常來說,同時開啟多個,需要保證各個事務之間不互相干擾,防止資料破壞。
4、永續性(Durability):事務一旦完成,無論系統出現什麼情況,其結果不受影響。
二、事務的基本屬性。
事務的屬性包括一下幾點。
Spring中的事務管理器介面TransactionDefinition,原始碼如下:
public interface TransactionDefinition {
int getPropagationBehavior(); // 返回事務的傳播行為
int getIsolationLevel(); // 返回事務的隔離級別,事務管理器根據它來控制另外一個事務可以看到本事務內的哪些資料
int getTimeout(); // 返回事務必須在多少秒內完成
boolean isReadOnly(); // 事務是否只讀,事務管理器能夠根據這個返回值進行優化,確保事務是隻讀的
}
下面來著重講解一下其中的幾點重要屬性
1、傳播行為(propagation behavior)
事務的傳播行為有以下7種:
2、隔離級別
隔離級別定義了一個事務可能受其他併發事務影響的程度。
首先來看一下,事務併發情況下可以出現的問題
1)髒讀:事務T1修改了a資料,但還未提交,此時,事務T2讀取到了a資料,但是如果T1回滾,則T2讀取到的資料為髒資料。
2)不可重複讀:事務T1重複讀取資料a的值,得到不同的值,這是由於T1在讀取資料的同時,事務T2對資料a進行了修改。
3)幻讀:幻讀與不可重複讀類似,事務T1查詢某些資料多次,得到不同數量的資料,這是由於事務T2在T1操作的同時,新增或者刪除了某些資料,造成了改結果。
★ 不可重複讀和幻讀的區別
1)不可重複讀注重的是修改:
事務T1讀取第一次:a=100;
事務T2修改:a=200;
事務T2讀取第二次:a=200;
造成不可重複讀。
幻讀注重的是新增或者刪除。
事務T1查詢第一次滿足條件m的資料有:100條;
事務T2新增資料,且滿足條件m:10條;
事務T1查詢第二次滿足條件m的資料有:110條;
這就造成了幻讀。
2)不可重複讀只需要鎖住滿足條件的記錄;
幻讀要鎖住滿足條件及其相近的記錄。
再來說說隔離級別
3、只讀
事務的第三個特性是它是否為只讀事務。如果事務只對後端的資料庫進行該操作,資料庫可以利用事務的只讀特性來進行一些特定的優化。通過將事務設定為只讀,你就可以給資料庫一個機會,讓它應用它認為合適的優化措施。
4、事務超時
為了使應用程式很好地執行,事務不能執行太長的時間。因為事務可能涉及對後端資料庫的鎖定,所以長時間的事務會不必要的佔用資料庫資源。事務超時就是事務的一個定時器,在特定時間內事務如果沒有執行完畢,那麼就會自動回滾,而不是一直等待其結束。
5、回滾規則
事務五邊形的最後一個方面是一組規則,這些規則定義了哪些異常會導致事務回滾而哪些不會。預設情況下,事務只有遇到執行期異常時才會回滾,而在遇到檢查型異常時不會回滾(這一行為與EJB的回滾行為是一致的)
但是你可以宣告事務在遇到特定的檢查型異常時像遇到執行期異常那樣回滾。同樣,你還可以宣告事務遇到特定的異常不回滾,即使這些異常是執行期異常。