本文介紹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 表示如果當前事務存在,則方法應該執行在乙個巢狀...