事務就是乙個或多個關聯操作,要麼都成功,要麼都失敗。
其就是通過事務的幾個特性保證的:【原子性】、【一致性】、【隔離性】、【永續性】
原子性:乙個或多個操作,要麼成功,要麼失敗。
一致性:資料從乙個一致性狀態變成另個一一致性狀態;
隔離性:乙個操作的事務並不會被其他事務所影響;
永續性:事務提交完成後,資料是不可被外界所影響的。
先定義兩個方法(偽**)
//將傳入引數a存入atable
pubilc void
a(a)
//將傳入引數b存入btable
public
void
b(b)
【required】: spring事務的預設機制,當前沒有事務,則建立乙個事務,如果存在事務,則加入到該事務中。
注:後面都是通過偽**進行分析
@transactional
(propagation = propagation.required)
public
void
testmain()
@transactional
(propagation = propagation.required)
public
void
testb()
testmain和testb方法都宣告了required事務,testmain中呼叫了testb方法,所以testb會加入到testmain的事務中,共享乙個事務。
當testb中丟擲異常後,b(b1)操作回滾,testmain在同乙個事務,所以也需要回滾。
所以a1、b1都不會插入,b2由於在異常後面,所以也不會插入成功。
另外舉乙個例子:
public
void
testmain()
@transactional
(propagation = propagation.required)
public
void
testb()
a1插入成功,b1和b2都失敗
因為testmain沒有宣告事務,testb宣告了required,testb自己會建立乙個,其丟擲異常,只會回滾自己的,呼叫方不受影響。所以a1能插入成功。
【supports】: 如果當前存在事務,則加入當前事務,如果當前沒有事務,則以非事務執行。
public
void
testmain()
@transactional
(propagation = propagation.supports)
public
void
testb()
a1和b1都插入成功,b2失敗
由於testmain沒有宣告事務,testb宣告的support,所以testb也沒有事務,testb的異常未對testmain產生影響,a1和b1都不用回滾;
但是,如果testmain宣告required事務機制,那麼testmain和testb都會放到同乙個事務中,兩個都要回滾。
【mandatory】:當前存在事務,則加入事務,如果不存在事務,則丟擲異常
public
void
testmain()
@transactional
(propagation = propagation.mandatory)
public
void
testb()
a1插入成功,b1和b2失敗
testmain沒有宣告事務,所以testb的異常與否不會影響a1的插入操作;
由於testmain沒有宣告事務,所以執行testb()的時候會丟擲異常,b1的操作都沒有執行,所以b1和b2都不會成功。
如果testmain宣告required,那麼a1和b1都會回滾。
【requires_new】: 無論如何,都要建立乙個新的事務,如果當前存在事務,則掛起不管
@transactional
(propagation = propagation.required)
public
void
testmain()
@transactional
(propagation = propagation.requires_new)
public
void
testb()
a1插入失敗,b1和b2成功。
testmain宣告的required,本來可以讓testb共享其事務,但是testb宣告的requires_new,自己單獨建立了乙個事務,不和testmain搞一起,所以testmain中丟擲異常對testb沒有絲毫影響。反而testmain自己要回滾。
【not_supported】: 無論如何,都不建立事務,即使當前存在事務,也掛起不用
@transactional
(propagation = propagation.required)
public
void
testmain()
@transactional
(propagation = propagation.not_supported)
public
void
testb()
b1插入成功,a1和b2失敗。
testmain宣告required開啟事務,testb丟擲異常,所以a1插入回滾;
testb宣告not_supported,不開啟事務,所以其丟擲異常,b1 不用回滾。
【never】: 始終不開啟事務,如果當前存在事務,則報錯;
@transactional
(propagation = propagation.required)
public
void
testmain()
@transactional
(propagation = propagation.never)
public
void
testb()
都不成功;
testmain開啟了事務,testb不允許開啟事務,所以直接報錯,b1和b2都不會執行,然而a1被回滾。
【nested】: 如果當前存在事務,則巢狀其中,如果不存在則建立乙個事務(類似於required)
和【required_new】的區別:
required_new是無論如何都自己開啟乙個事務,和其他事務沒有關係;而nested是父事務開啟乙個巢狀事務(子事務),如果父事務回滾了,那麼子事務也會回滾;
和【required】的區別:
required是關聯操作都放在乙個事務裡,無論是否catch異常,所有操作都要回滾;而nested是子事務丟擲異常回滾了,父事務如果catch住了,那麼父事務無需回滾。
@transactional
(propagation = propagation.required)
public
void
testmain()
@transactional
(propagation = propagation.nested)
public
void
testb()
所有操作都回滾了
testmain宣告的required,testb與其共享乙個事務,所以testmain異常時,父子事務都要回滾。
@transactional
(propagation = propagation.required)
public
void
testmain()
catch(exception e)
a(a2);}
@transactional
(propagation = propagation.nested)
public
void
testb()
a1和a2插入成功
testb宣告的nested,丟擲異常,b1回滾,但是testmain中對testb丟擲的異常catch了,不影響testmain的事務,所以a1和a2能插入成功。
Spring事務傳播機制
在 spring的 transactiondefinition介面中一共定義了7種事務傳播屬性 propagation required 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇,也是spring事務傳播機制的預設值。propagation supports 支援當前事務,如...
spring事務傳播機制
1.required 必須有乙個事務的支援。如果沒有事務,則新建立乙個,如果有父事務,則使用 fetch 父級事務 2.requires new 必定會建立乙個事務。如果有父事務,則掛起 suspend 父事務,等子事務執行完畢,在恢復 resume 父事務 3.supports 可以有或者沒有事務...
spring事務傳播機制
spring事務傳播機制 propagation required spring預設 如果已經存在事務,那麼加入當前事務,如果不存在事務,則新建事務。總是建立乙個新的事務。新建立事務a,而以前的事務b還在執行。此時有兩個事務,事務a先執行,事務b則被掛起。只有事務a執行完畢後,事務b將繼續執行。ro...