spring 事務屬性

2022-03-29 07:37:36 字數 2900 閱讀 6655

本文介紹spring事務的5個屬性

spring中,宣告事務是通過事務屬性來定義的。事務屬性描述了事務策略如何應用到方法上事務屬性包含5個方面:

傳播行為定義了客戶端與被呼叫方法之間的事務邊界,即傳播規則回答了這樣的乙個問題,新的事務應該被啟動還是掛起,或者方法是否要在事務環境中執行。7中傳播規則:

propagation_mandatory(強制傳播):表示該方法必須在事務中執行,如果當前事務不存在,則會丟擲乙個異常

propagation_nested(巢狀傳播):表示如果當前存在乙個事務,那麼該方法就回在巢狀事務中執行,巢狀的事務可以獨立於當前事務進行單獨地提交或回滾,如果當前事務不存在,那麼其行為與propagation_required一樣

propagation_never:(從不傳播):表示當前方法不應該執行在事務上下文中,如果檔期正有乙個事務在執行,則會丟擲異常

propagation_not_suppored(不支援傳播):表示該方法不應該執行在事務中,如果存在當前事務,在該方法執行期間,當前事務將會被掛起

propagation_required(必要傳播):表示當前事務必須執行在事務中,如果當前事務存在,方法將會在該事務中執行,否則,會啟動乙個新的事務

propagation_required_new(新建必要傳播):表示當前方法必須執行在自己的事務當中(執行在乙個新建的事務當中),如果當前存在事務,當前事務掛起 

propagation_support(支援事務):表示當前方法不需要事務上下文,但是如果存在當前事務的話,那麼蓋房會在這個事務中執行

隔離級別定義了乙個事務可能受其他併發事務影響的程度。

多個併發事務可能會導致一下問題:

髒讀---髒讀發生在乙個事務獨缺了冰乙個事務改寫但尚未提交的資料時,如果改寫在稍後被回滾了,那麼第乙個事務獲取的資料就是無效的。

不可重複讀---不可重複讀發生在乙個事務執行相同的查詢兩次或兩次以上,但是每次都得到不同的資料時,這通常是因為另乙個併發事務在兩次查詢期間更新了資料。

幻讀---幻讀發生在乙個事務讀取了幾行資料,接著另外乙個事務插入了一些資料,在隨後的查詢中,第一格式就回發現多了一些原本不存在的記錄。

隔離規則:

isolation_default:使用後端資料庫預設的規則

isolation_read_uncommitted:允許讀取尚未提交的資料變更,可能會導致髒讀,幻讀或不可重複讀

isolation_read_committed:允許讀取併發事務已經提交的資料,可以防止髒讀,但是幻讀或不可重複讀仍有可能發生

isolation_repeatable_read:對同意欄位的多次讀取結果是一致的,除非資料是被本事務自己所修改,看阻止髒讀和不可重複讀,但幻讀仍有可能發生

isolatiom_serializable:完全服從acid的隔離級別,確保阻止髒讀,不可重複讀以及幻讀,這是最慢的資料隔離級別

如果事務只對後端的資料庫進行讀操作,資料庫可以利用事務id唯讀特性來進行一些特定的優化。通過將事務設定為唯讀,你就可以給資料庫乙個機會,讓他應用它認為合適的優化措施。因為是否唯讀是在事務啟動的時候由資料庫實施的,所以只有對那些具備可能啟動乙個新事務的傳播行為(propagation_required,propagation_required_new,propagation_nested)的方法來說,才有意義。

為了使應用程式很好地執行,事務不能執行太長時間。因為超時時鐘會在事務開始時啟動,所以只有對那些具備可能啟動乙個新事務的傳播行為(propagation_required,propagation_required_new,propagation_nested)的方法來說,才有意義。

事務回滾規則定義了哪些異常會導致事務回滾而哪些不會。預設情況下,事務只有在遇到執行時期異常才回滾,而在遇到檢查型異常時不會回滾。

具體看下xml配置

<

tx:annotation-driven

/>

<

tx:advice

id="txadvice"

transactionmanager

="transactionmanager"

>

<

tx:attributes

>

<

tx:method

name

="*"

propagation

="required"

/>

tx:attributes

>

tx:advice

>

<

aop:config

expose-proxy

="true"

proxy-target-class

="true"

>

<

aop:pointcut

id="txpointcut"

expression

="execution(* com.weiaigongdi.access..service..*+.*(..))"

/>

<

aop:advisor

id="txadvisor"

advice-ref

="txadvice"

pointcut-ref

="txpointcut"

/>

aop:config

>

<

bean

id="transactionmanager"

class

="org.springframework.jdbc.datasource.datasourcetransactionmanager"

>

<

property

name

="datasource"

ref="ds1"

/>

bean

>

Spring 事務屬性

spring事務機制主要包括宣告式事務和程式設計式事務,此處側重講解宣告式事務,程式設計式事務在實際開發中得不到廣泛使用,僅供學習參考。spring宣告式事務讓我們從複雜的事務處理中得到解脫。使得我們再也無需要去處理獲得連線 關閉連線 事務提交和回滾等這些操作。再也無需要我們在與事務相關的方法中處理...

spring事務屬性

事務屬性的種類 傳播行為 隔離級別 唯讀和事務超時 a 傳播行為定義了被呼叫方法的事務邊界。傳播行為 意義propergation mandatory 表示方法必須執行在乙個事務中,如果當前事務不存在,就丟擲異常 propagation nested 表示如果當前事務存在,則方法應該執行在乙個巢狀事...

Spring事務屬性

事務屬性的種類 傳播行為 隔離級別 唯讀和事務超時 a 傳播行為定義了被呼叫方法的事務邊界。傳播行為 意義 propergation mandatory 表示方法必須執行在乙個事務中,如果當前事務不存在,就丟擲異常 propagation nested 表示如果當前事務存在,則方法應該執行在乙個巢狀...