當事務方法被另乙個事務方法呼叫時, 必須指定事務應該如何傳播。例如: 方法可能繼續在現有事務中執行, 也可能開啟乙個新事務, 並在自己的事務中執行;
事務的傳播行為可以由傳播屬性指定;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...