spring事務的屬性

2021-08-21 05:30:57 字數 2723 閱讀 4278

事務屬性的種類:   傳播行為、隔離級別、唯讀和事務超時

a)傳播行為定義了被呼叫方法的事務邊界。

傳播行為

意義

propergation_mandatory

表示方法必須執行在乙個事務中,如果當前事務不存在,就丟擲異常

propagation_nested

表示如果當前事務存在,則方法應該執行在乙個巢狀事務中。否則,它看起來和propagation_required 看起來沒什麼倆樣

propagation_never

表示方法不能執行在乙個事務中,否則丟擲異常

propagation_not_supported

表示方法不能執行在乙個事務中,如果當前存在乙個事務,則該方法將被掛起

propagation_required

表示當前方法必須執行在乙個事務中,如果當前存在乙個事務,那麼該方法執行在這個事務中,否則,將建立乙個新的事務

propagation_requires_new

表示當前方法必須執行在自己的事務中,如果當前存在乙個事務,那麼這個事務將在該方法執行期間被掛起

propagation_supports

表示當前方法不需要執行在乙個是事務中,但如果有乙個事務已經存在,該方法也可以執行在這個事務中

b)隔離級別

在運算元據時可能帶來 3 個***,分別是髒讀、不可重複讀、幻讀。為了避免這 3 中***的發生,在標準的 sql 語句中定義了 4 種隔離級別,分別是未提交讀、已提交讀、可重複讀、可序列化。而在 spring 事務中提供了 5 種隔離級別來對應在sql 中定義的 4 種隔離級別,如下:

隔離級別

意義

isolation_default

使用後端資料庫預設的隔離級別

isolation_read_uncommitted

允許讀取未提交的資料(對應未提交讀),可能導致髒讀、不可重複讀、幻讀

isolation_read_committed

允許在乙個事務中讀取另乙個已經提交的事務中的資料(對應已提交讀)。可以避免髒讀,但是無法避免不可重複讀和幻讀

isolation_repeatable_read

乙個事務不可能更新由另乙個事務修改但尚未提交(回滾)的資料(對應可重複讀)。可以避免髒讀和不可重複讀,但無法避免幻讀

isolation_serializable

這種隔離級別是所有的事務都在乙個執行佇列中,依次順序執行,而不是並行(對應可序列化)。可以避免髒讀、不可重複讀、幻讀。但是這種隔離級別效率很低,因此,除非必須,否則不建議使用。

c)唯讀

如果在乙個事務中所有關於資料庫的操作都是唯讀的,也就是說,這些操作只讀取資料庫中的資料,而並不更新資料,那麼應將事務設為唯讀模式( read_only_marker ) , 這樣更有利於資料庫進行優化 。

因為唯讀的優化措施是事務啟動後由資料庫實施的,因此,只有將那些具有可能啟動新事務的傳播行為(propagation_nested 、 propagation_required 、 propagation_required_new) 的方法的事務標記成唯讀才有意義。

如果使用 hibernate 作為持久化機制,那麼將事務標記為唯讀後,會將 hibernate 的 flush 模式設定為fulsh_never, 以告訴 hibernate 避免和資料庫之間進行不必要的同步,並將所有更新延遲到事務結束。

d)事務超時

如果乙個事務長時間執行,這時為了盡量避免浪費系統資源,應為這個事務設定乙個有效時間,使其等待數秒後自動回滾。與設

置「唯讀」屬性一樣,事務有效屬性也需要給那些具有可能啟動新事物的傳播行為的方法的事務標記成唯讀才有意義。

//**牛客

Spring的事務屬性

在transactiondefinition介面中定義了五個不同的事務隔離級別 引用巢狀事務乙個非常重要的概念就是內層事務依賴於外層事務。外層事務失敗時,會回滾內層事務所做的動作。而內層事務操作失敗並不會引起外層事務的回滾。propagation requires new 和 propagation...

Spring 事務屬性

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

spring事務屬性

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