spring事務的傳播行為7種和隔離級別

2022-09-18 21:18:10 字數 3255 閱讀 4454

spring特有的事務傳播行為,spring支援7種事務傳播行為,確定客戶端和被呼叫端的事務邊界(說得通俗一點就是多個具有事務控制的service的相互呼叫時所形成的複雜的事務邊界控制)下圖所示為7鐘事務傳播機制

propagation_required(xml檔案中為required)

表示當前方法必須在乙個具有事務的上下文中執行,如有客戶端有事務在進行,那麼被呼叫端將在該事務中執行,否則的話重新開啟乙個事務。(如果被呼叫端發生異常,那麼呼叫端和被呼叫端事務都將回滾)

propagation_supports(xml檔案中為supports)

表示當前方法不必需要具有乙個事務上下文,但是如果有乙個事務的話,它也可以在這個事務中執行

propagation_mandatory(xml檔案中為mandatory)

表示當前方法必須在乙個事務中執行,如果沒有事務,將丟擲異常

propagation_nested(xml檔案中為nested)

表示如果當前方法正有乙個事務在執行中,則該方法應該執行在乙個巢狀事務中,被巢狀的事務可以獨立於被封裝的事務中進行提交或者回滾。如果封裝事務存在,並且外層事務丟擲異常回滾,那麼內層事務必須回滾,反之,內層事務並不影響外層事務。如果封裝事務不存在,則同propagation_required的一樣

propagation_never(xml檔案中為never)

表示當方法務不應該在乙個事務中執行,如果存在乙個事務,則丟擲異常

propagation_requires_new(xml檔案中為requires_new)

表示當前方法必須執行在它自己的事務中。乙個新的事務將啟動,而且如果有乙個現有的事務在執行的話,則這個方法將在執行期被掛起,直到新的事務提交或者回滾才恢復執行。

propagation_not_supported(xml檔案中為not_supported)

表示該方法不應該在乙個事務中執行。如果有乙個事務正在執行,他將在執行期被掛起,直到這個事務提交或者回滾才恢復執行

spring事務特性

transactiondefinition介面定義以下特性:

事務隔離級別

隔離級別是指若干個併發的事務之間的隔離程度。transactiondefinition 介面中定義了五個表示隔離級別的常量:

事務超時

所謂事務超時,就是指乙個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 transactiondefinition 中以 int 的值來表示超時時間,其單位是秒。

預設設定為底層事務系統的超時值,如果底層資料庫事務系統沒有設定超時值,那麼就是none,沒有超時限制。

事務唯讀屬性

唯讀事務用於客戶**唯讀但不修改資料的情形,唯讀事務用於特定情景下的優化,比如使用hibernate的時候。

預設為讀寫事務。

spring事務回滾規則

指示spring事務管理器回滾乙個事務的推薦方法是在當前事務的上下文內丟擲異常。spring事務管理器會捕捉任何未處理的異常,然後依據規則決定是否回滾丟擲異常的事務。

預設配置下,spring只有在丟擲的異常為執行時unchecked異常時才回滾該事務,也就是丟擲的異常為runtimeexception的子類(errors也會導致事務回滾),而丟擲checked異常則不會導致事務回滾。

可以明確的配置在丟擲那些異常時回滾事務,包括checked異常。也可以明確定義那些異常丟擲時不回滾事務。

還可以程式設計性的通過setrollbackonly()方法來指示乙個事務必須回滾,在呼叫完setrollbackonly()後你所能執行的唯一操作就是回滾。

@transactional註解

@transactional屬性

屬性型別

描述value

string

可選的限定描述符,指定使用的事務管理器

propagation

enum: propagation

可選的事務傳播行為設定

isolation

enum: isolation

可選的事務隔離級別設定

readonly

boolean

讀寫或唯讀事務,預設讀寫

timeout

int (in seconds granularity)

事務超時時間設定

rollbackfor

class物件陣列,必須繼承自throwable

導致事務回滾的異常類陣列

rollbackforclassname

類名陣列,必須繼承自throwable

導致事務回滾的異常類名字陣列

norollbackfor

class物件陣列,必須繼承自throwable

不會導致事務回滾的異常類陣列

norollbackforclassname

類名陣列,必須繼承自throwable

不會導致事務回滾的異常類名字陣列

public enum propagation 

required(0),

supports(1),

mandatory(2),

requires_new(3),

not_supported(4),

never(5),

nested(6);

用法

1. 在需要事務管理的地方加@transactional 註解。@transactional 註解可以被應用於介面定義和介面方法、類定義和類的 public 方法上。

2. @transactional 註解只能應用到 public 可見度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @transactional 註解,它也不會報錯, 但是這個被註解的方法將不會展示已配置的事務設定。

3. 注意僅僅 @transactional 註解的出現不足於開啟事務行為,它僅僅 是一種元資料。必須在配置檔案中使用配置元素,才真正開啟了事務行為。

4. 通過 元素的 "proxy-target-class" 屬性值來控制是基於介面的還是基於類的**被建立。如果 "proxy-target-class" 屬值被設定為 "true",那麼基於類的**將起作用(這時需要cglib庫cglib.jar在classpath中)。如果 "proxy-target-class" 屬值被設定為 "false" 或者這個屬性被省略,那麼標準的jdk基於介面的**將起作用。

超時時間相關設定:j**a事務超時時間_spring事務超時時間可能存在的錯誤認識

Spring的7種事務傳播行為

事務傳播行為指的是乙個事務方法被另乙個事務方法呼叫時,這個事務方法應該如何進行。比如說,有乙個a方法,裡面呼叫了b方法,當執行到b方法時,是應該在當前事務裡執行,還是重新開啟乙個事務來執行,這是由b方法的事務傳播行為決定的 propagation required 表明當前方法一定要在事務中執行,如...

Spring事務的7種傳播行為

事務傳播行為指的就是當事務方法被另乙個事務方法呼叫時,這個事務方法應該如何進行。例如 methoda事務方法呼叫methodb事務方法時,methodb是繼續在呼叫者methoda的事務中執行呢,還是為自己開啟乙個新事務執行,這就是由methodb的事務傳播行為決定的。以下舉例時 方法a 中呼叫方法...

Spring7種事務傳播行為型別

事務傳播行為種類 spring在transactiondefinition介面中規定了7種型別的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播 事務傳播行為型別 事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙...