7個傳播行為。4個隔離級別。
Spring事務的傳播行為和隔離級別[transaction behaviorand isolatedlevel]
Spring中事務的定義:
Propagation
(key屬性確定代理應該給哪個方法添加事務行為。這種屬性最重要的部份是傳播行為。)有下面選項可供使用:
PROPAGATION_REQUIRED--支持當前事務,假設當前沒有事務。就新建一個事務。
這是最常見的選擇。
PROPAGATION_SUPPORTS--支持當前事務,假設當前沒有事務,就以非事務方式運行。
PROPAGATION_MANDATORY--支持當前事務,假設當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW--新建事務,假設當前存在事務。把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式運行操作。假設當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式運行,假設當前存在事務,則拋出異常。
舉例淺析Spring嵌套事務
ServiceA { void methodA() { ServiceB.methodB(); } } ServiceB { void methodB() { } }
PROPAGATION_REQUIRED
假如當前正要運行的事務不在另外一個事務里,那么就起一個新的事務
比方說,ServiceB.methodB的事務級別定義為PROPAGATION_REQUIRED, 那么因為執行ServiceA.methodA的時候,ServiceA.methodA已經起了事務。這時調用ServiceB.methodB,ServiceB.methodB看到自己已經執行在ServiceA.methodA的事務內部。就不再起新的事務。而假如ServiceA.methodA執行的時候發現自己沒有在事務中,他就會為自己分配一個事務。這樣,在ServiceA.methodA或者在ServiceB.methodB內的不論什么地方出現異常。事務都會被回滾。即使ServiceB.methodB的事務已經被提交,可是ServiceA.methodA在接下來fail要回滾,ServiceB.methodB也要回滾
PROPAGATION_SUPPORTS
假設當前在事務中。即以事務的形式執行。假設當前不再一個事務中,那么就以非事務的形式執行
PROPAGATION_MANDATORY
必須在一個事務中執行。也就是說,他僅僅能被一個父事務調用。否則,他就要拋出異常
PROPAGATION_REQUIRES_NEW
這個就比較繞口了。 比方我們設計ServiceA.methodA的事務級別為PROPAGATION_REQUIRED,ServiceB.methodB的事務級別為PROPAGATION_REQUIRES_NEW。那么當運行到ServiceB.methodB的時候,ServiceA.methodA所在的事務就會掛起。ServiceB.methodB會起一個新的事務。等待ServiceB.methodB的事務完畢以后,他才繼續運行。
他與PROPAGATION_REQUIRED 的事務差別在於事務的回滾程度了。由於ServiceB.methodB是新起一個事務,那么就是存在兩個不同的事務。假設ServiceB.methodB已經提交,那么ServiceA.methodA失敗回滾。ServiceB.methodB是不會回滾的。假設ServiceB.methodB失敗回滾,假設他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務仍然可能提交。
PROPAGATION_NOT_SUPPORTED
當前不支持事務。比方ServiceA.methodA的事務級別是PROPAGATION_REQUIRED 。而ServiceB.methodB的事務級別是PROPAGATION_NOT_SUPPORTED ,那么當執行到ServiceB.methodB時。ServiceA.methodA的事務掛起。而他以非事務的狀態執行完,再繼續ServiceA.methodA的事務。
PROPAGATION_NEVER
不能在事務中執行。
如果ServiceA.methodA的事務級別是PROPAGATION_REQUIRED。 而ServiceB.methodB的事務級別是PROPAGATION_NEVER ,那么ServiceB.methodB就要拋出異常了。
PROPAGATION_NESTED
理解Nested的關鍵是savepoint。
他與PROPAGATION_REQUIRES_NEW的差別是,PROPAGATION_REQUIRES_NEW另起一個事務。將會與他的父事務相互獨立。而Nested的事務和他的父事務是相依的,他的提交是要等和他的父事務一塊提交的。
也就是說,假設父事務最后回滾。他也要回滾的。
而Nested事務的優點是他有一個savepoint。