一、事務四大特徵
考試面試要用,原子、一致、隔離和持久
1.原子
try{
doA()
doB()
doC()
...
}catch(AnyException){
unDoA(),unDoB(),unDoC()
}
2.一致
一致就涉及到事務了,定義為事務結束後,所有的人拿到的資料、索引都應該是一致的。
個人理解:就是原子操作完之後,所有的人拿到的資料、索引都應該是一致的。
3.隔離
保證不同的事務相互獨立、透明地執行。
級聯廢棄:如果事務T1讀到了事務T2未提交的資料,如果T2提
交失敗,那麼T1也要復原。
隔離等級:
Read Uncommitted(讀未提交)
Read Committed(讀已提交)
Repeatable Read(可重複讀)(MySQL預設隔離等級)
Serializable(序列化)
髒讀、不可重複讀取、幻讀
髒讀:一事務對資料進行了增刪改,但未提交,有可能復原,另一事務卻讀取了未提交的資料。
不可重複讀取: 一事務對資料進行了更新或刪除操作,另一事務兩次查詢的資料不一致。
幻讀: 一事務對資料進行了新增操作,另一事務兩次查詢的資料不一致。
髒讀:主要是針對列內容的變化。
幻讀:主要是針對行數的變化
二、分散式交易(流行的解決方案)
指會涉及到操作多個資料庫的事務
1. 涉及多個系統,多個資料來源,多個Connection的資料庫操作。
2.怎麼保證一致性。
兩階段交易認可、三階段提交、事件模型
具體方案的實現待補充
三、Spring交易管理 @Transacational
1、Isolation(隔離性):
DEFAULT: 使用資料庫設定
READ_UNCOMMITTED: 會出現髒讀、不可重複讀取、幻讀
READ_COMMITTED: 會出現不可重複讀取、幻讀問題
REPEATABLE_READ: 會出幻讀
SERIALIZABLE: 保證所有的情況不會發生
2、propagation (傳播性):
requeired
supports
requried_new
not supported
mandatory
never
nested
3、程式碼分析
public class TxTest{ @Transacational public void foo(){ bar(); } @Transacational(propagation=”required_new”) public void bar(){ }}
調用foo()方法只會建立當前方法的事務,方法裡面bar()即使定義required_new也不會建立新的事務。
public class TxTest{ @Autowird private TxTest2 txTest2; @Transacational public void foo(){ txTest2.bar(); }}public class TxTest2{ @Transacational(propagation=”required_new”) public void bar(){ }}調用foo()方法會建立當前方法的事務,運行到txTest2.bar()時會建立一個新的事務。