Spring事務傳播屬性和隔離級別

2021-10-02 22:05:46 字數 1646 閱讀 1972

當事務方法被另乙個事務方法呼叫時, 必須指定事務應該如何傳播。例如: 方法可能繼續在現有事務中執行, 也可能開啟乙個新事務, 並在自己的事務中執行;

事務的傳播行為可以由傳播屬性指定;spring 定義了7種類傳播行為;

傳播屬性

描述required(常用)如果有事務在執行,當前的方法就在這個事務內執行,否則,就啟動乙個新的事務,並在自己的事務內執行,也是spring傳播屬性的預設值

required_new(常用)當前的方法必須啟動新事務,並在它自己的事務內執行;如果有事務正在執行,應該將它桂起

supports

如果有事務在執行,當前的方法就在這個事務內執行;否則它可以不執行在事務中

not_supportei

當前的方法不應該執行在事務中;如果有執行的事務,將它桂起

mandatory

當前的方法必須執行在事務內部,如果沒有正在執行的事務,就丟擲異常

never

當前的方法不應該執行在事務中;如果有執行的事務,就丟擲異常

nested

如果有事務在執行,當前的方法就應該在這個事務的嶔巢狀事務內執行;否則,就啟動乙個新的事務,並在它自己的事務內執行

事務傳播屬性的設定:

@transaction(propagation=「propagation.事務」)

資料庫併發問題:

資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響.避免各種併發問題。乙個事務與其他事務隔離的程度稱為隔離級別。 sql標準中規定了多種事務隔離級別;不同隔離級別對應不同的干擾程度,隔離級別越高.資料一致性就越好,但併發性越弱。

讀未提交:read uncommitted

允許transaction0l讀取transaction02未提交的修改。

讀己提交:read committed

要求transaction0l只能讀取transaction02己提交的修改。

可重複讀:repeatable read

確保transaction0l可以多次從乙個欄位中讀取到相同的值,即transactionol執行期間禁止其它事務對這個字段進行更新。

序列化:serializable

確保transaction0l可以多次從乙個表中讀取到相同的行。在transaction0l執行期間,禁止其它事務對這個表進行新增、更新、刪除操作。可以避免任何併發問題,但效能十分低下。

各個級別解決併發問題的能力

髒讀不可重複讀

幻讀read uncommitted√√

√read committed×√

√repeatable read××

√serializable××

×oracle和mysql對事務隔離級別的支援程度

oracle

mysql

read uncommitted×√

read committed(開發時通常使用的隔離級別)

√(預設)

√repeatable read

×√(預設)

serializable√√

事務的隔離級別的設定:

@transaction(isolation=「isolation.隔離級別」)

spring事務傳播和事務隔離

是最常用的,支援當前事務,若當前沒事務,就新建乙個事務。經測試,左側的事務註解必須得新增,右側的可加可不加 這倆insert事務合併成乙個事務了 支援當前事務,若當前沒事務,就以非事務方式執行。上圖 a調b,a有事務,b事務用supports,ab合併為乙個事務了。ab都會回滾 上圖 a調b,a無事...

事務和事務隔離級別,Spring事務傳播和隔離級別

一 事務有四大特性,也即原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 1 原子性 即不可分割,事務要麼全部被執行,要麼全部不執行。如果事務的所有子事務全部提交成功,則所有的資料庫操作被提交,資料庫狀態發生變化 如果有子事務失敗,...

Spring 事務傳播屬性

propagation required 支援當前事務,如果不存在這建立乙個新事務,這是預設的事務管理。propagation supports 支援當前事務,如果不存在則已非事務的方式執行 propagation mandatory 如果存在乙個事務,支援當前事務,如果沒有事務活動則丟擲異常 pr...