搜尋** 198200.com
spring在transactiondefinition介面中規定了7種型別的事務傳播行為。事務傳播行為是spring框架獨有的事務增強特性,他不屬於的事務實際提供方資料庫行為。這是spring為我們提供的強大的工具箱,使用事務傳播行可以為我們的開發工作提供許多便利。但是人們對他的誤解也頗多,你一定也聽過「service方法事務最好不要巢狀」的傳言。要想正確的使用工具首先需要了解工具。
事務傳播行為用來描述由某乙個事務傳播行為修飾的方法被巢狀進另乙個方法的時事務如何傳播。
用偽**說明:
1 @transaction(propagation=***)methoda中存在事務,他又呼叫了methodb。methodb事物的一些特性由methoda決定,這就是事務的傳播行為。2public
void
methoda()67
public
void
methodb()
事務傳播行為型別
說明propagation_required如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。
propagation_supports
支援當前事務,如果當前沒有事務,就以非事務方式執行。
propagation_mandatory
使用當前的事務,如果當前沒有事務,就丟擲異常。
propagation_requires_new新建事務,如果當前存在事務,把當前事務掛起。
propagation_not_supported
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
propagation_never
以非事務方式執行,如果當前存在事務,則丟擲異常。
propagation_nested
如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作。
定義非常簡單,也很好理解,下面我們就進入**測試部分,驗證我們的理解是否正確。
第一種情況。內部均為 propagation = propagation.required
1張三,李四插入均失敗。@transactional(propagation = propagation.required, isolation = isolation.repeatable_read)2
@override
3public
void
testtransactional() ", insert);
67 insert =downloadimgdao.test2();
8 log.info("insert2 = {}", insert);9}
1011
@transactional(propagation = propagation.required, isolation = isolation.repeatable_read)12
@override
13public
inttest1() ", res);
20return
res;21}
2223
24@transactional(propagation = propagation.required, isolation = isolation.repeatable_read)
25
@override
26public
inttest2() ", res);
3334
int i = 5 / 0;
35return
res;
36 }
第二種情況。內部一種為 propagation = propagation.required,一種為propagation.requires_new
1@transactional(propagation = propagation.requires_new, isolation = isolation.repeatable_read) 2張三插入成功,李四插入失敗。@override
3public
inttest1() ", res);
10return
res;11}
1213
14@transactional(propagation = propagation.required, isolation = isolation.repeatable_read)15
@override
16public
inttest2() ", res);
2324
int i = 5 / 0;
25return
res;
26 }
第三種情況。內部均為propagation.requires_new
跟我們現象的是一樣的,如果哪個test異常,哪個就失敗,無異常的就成功。
還有一種情況是,外圍拋異常了,內部都不拋異常,兩種內部插入也都會成功。
本程式是實驗了propagation_required以及propagation.requires_new。
事務預設以propagation_required來隔離。
1: 如果內部是propagation_required隔離級別,內部只要乙個方法出錯,那麼整個事務都會回滾。
2: 如果內部有方法以propagation.requires_new來隔離。那麼他會建立乙個新的事務來執行,如果他拋異常了,並不會影響其他事務的以及外部的事務。
spring事務官方文件:
Spring 事務傳播屬性
propagation required 支援當前事務,如果不存在這建立乙個新事務,這是預設的事務管理。propagation supports 支援當前事務,如果不存在則已非事務的方式執行 propagation mandatory 如果存在乙個事務,支援當前事務,如果沒有事務活動則丟擲異常 pr...
Spring的事務傳播屬性
required 業務方法需要在乙個事務中執行。如果方法執行時,已經處在乙個事務中,那麼加入到該事務,否則為自己建立乙個新的事務。not supported 宣告方法不需要事務。如果方法沒有關聯到乙個事務,容器不會為它開啟事務。如果方法在乙個事務中被呼叫,該事務會被掛起,在方法呼叫結束後,原先的事務...
spring事務傳播
採用程式設計式事務 1 getcurrentsession 與opensession 的區別?採用getcurrentsession 建立的session會繫結到當前執行緒中,而採用opensession 建立的session則不會 採用getcurrentsession 建立的session在co...