事務屬性的種類:傳播行為、隔離級別、唯讀和事務超時
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事務傳播特性
1.propagation required 如果存在乙個事務 則支援當前事務。如果沒有事務則開啟。2.propagation supports 如果存在乙個事務 則支援當前事務。如果沒有事務則非事務執行。3.propagation mandatory 如果已經存在乙個事務 則支援當前事務。如果沒有...
spring事務傳播特性
spring事務傳播特性 事務傳播行為就是多個事務方法相互呼叫時,事務如何在這些方法間傳播。spring支援7種事務傳播行為 spring 預設的事務傳播行為是 propagation required,它適合於絕大多數的情況。假設 servivex methodx 都工作在事務環境下 即都被 sp...
Spring事務傳播特性
傳播性值描述 propagation required 0當前有事務就用當前的,沒有就用新的 propagation supports 1事務可有可無,不是必須的 propagation mandatory 2當前一定要有事務,不然就拋異常 propagation requires new 3無論是...