Spring事務的傳播屬性

2021-10-06 21:16:50 字數 3072 閱讀 1255

搜尋** 198200.com

spring在transactiondefinition介面中規定了7種型別的事務傳播行為。事務傳播行為是spring框架獨有的事務增強特性,他不屬於的事務實際提供方資料庫行為。這是spring為我們提供的強大的工具箱,使用事務傳播行可以為我們的開發工作提供許多便利。但是人們對他的誤解也頗多,你一定也聽過「service方法事務最好不要巢狀」的傳言。要想正確的使用工具首先需要了解工具。

事務傳播行為用來描述由某乙個事務傳播行為修飾的方法被巢狀進另乙個方法的時事務如何傳播。

用偽**說明:

1 @transaction(propagation=***)

2public

void

methoda()67

public

void

methodb()

methoda中存在事務,他又呼叫了methodb。methodb事物的一些特性由methoda決定,這就是事務的傳播行為。

事務傳播行為型別

說明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...