spring的事務傳播機制

2021-10-21 02:32:01 字數 4340 閱讀 1130

事務就是乙個或多個關聯操作,要麼都成功,要麼都失敗。

其就是通過事務的幾個特性保證的:【原子性】、【一致性】、【隔離性】、【永續性】

原子性:乙個或多個操作,要麼成功,要麼失敗。

一致性:資料從乙個一致性狀態變成另個一一致性狀態;

隔離性:乙個操作的事務並不會被其他事務所影響;

永續性:事務提交完成後,資料是不可被外界所影響的。

先定義兩個方法(偽**)

//將傳入引數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...