事務5種屬性
1.事務傳播性 propagation
2.事務隔離性 isolation
3.事務回滾屬性 rollbackfor…等
4.事務唯讀屬性 readonly && 事務超時屬性 timeout
用@transaction宣告註解方式**例項
1).事務傳播屬性
當事務方法被另乙個事務方法呼叫時, 必須指定事務應該如何傳播. 例如: 方法可能繼續在現有事務中執行, 也可能開啟乙個新事務,
並在自己的事務中執行.
事務的傳播行為可以由傳播屬性指定. spring 定義了 7 種類傳播行為.
常用的有required 和 required_new 屬性
按著需求來介紹
propagation 屬性設定為required 時事務情況
當 bookservice 的 purchase() 方法被另乙個事務方法 checkout() 呼叫時, 它缺省會在現有的事務內執行.這個預設的傳播行為就是required. 因此在 checkout() 方法的開始和終止邊界內只有乙個事務. 這個事務只在
checkout() 方法結束的時候被提交, 結果使用者一本書都買不了
事務傳播屬性可以在 @transactional 註解的 propagation 屬性中定義
如圖所示 事務情況
propagation 屬性設定為required_new 時事務情況
另一種常見的傳播行為是 requires_new. 它表示該方法必須啟動乙個新事務, 並在自己的事務內執行. 如果有事務在執行, 就應該先掛起它.
如圖所示:
傳播性還可以通過xml配置下,如圖
那麼併發事務也會導致的一些問題
**當同乙個應用程式或者不同應用程式中的多個事務在同乙個資料集上併發執行時, 可能會出現許多意外的問題
併發事務所導致的問題可以分為下面三種型別:
髒讀: 對於兩個事物 t1, t2, t1 讀取了已經被 t2 更新但還沒有被提交的字段. 之後, 若 t2 回滾,t1讀取的內容就是臨時且無效的.
不可重複讀:對於兩個事物 t1, t2, t1 讀取了乙個字段, 然後 t2 更新了該字段. 之後, t1再次讀取同乙個字段,值就不同了.
幻讀:對於兩個事物 t1, t2, t1 從乙個表中讀取了乙個字段, 然後 t2 在該表中插入了一些新的行. 之後, 如果 t1再次讀取同乙個表, 就會多出幾行.
因此我們需要將事務與事務之間隔離。
2).事務隔離性
- 從理論上來說, 事務應該彼此完全隔離, 以避免併發事務所導致的問題. 然而, 那樣會對效能產生極大的影響, 因為事務必須按順序執行.
- 在實際開發中, 為了提公升效能, 事務會以較低的隔離級別執行.
- 事務的隔離級別可以通過隔離事務屬性指定
1.事務隔離級別
sping支援的事務隔離級別:上圖
事務的隔離級別要得到底層資料庫引擎的支援, 而不是應用程式或者框架的支援.
oracle 支援的 2 種事務隔離級別:read_commited , serializable
mysql 支援 4 中事務隔離級別.
read uncommitted(讀取未提交內容)所有事務都可以看到其他未提交(commit)事務的執行結果
read committed(讀取提交內容)乙個事務只能看見已經提交事務所做的改變。
repeatable read(可重讀)mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。
serializable(序列化執行)通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
3).設定回滾事務
預設情況下只有未檢查異常(runtimeexception和error型別的異常)會導致事務回滾. 而受檢查異常不會.
事務的回滾規則可以通過 @transactional 註解的 rollbackfor 和 norollbackfor 屬性來定義.這兩個屬性被宣告為 class 型別的, 因此可以為這兩個屬性指定多個異常類.:上圖
rollbackfor: 遇到io、sql exception 時必須進行回滾
norollbackfor: 一組異常類,遇到arithmeticexception 時必須不回滾
一般這個值是不設定的,預設未檢查異常(runtimeexception和error型別的異常)會回滾。
4).超時和唯讀屬性 readonly & timeout
為什麼要有這兩個屬性
設定超時和唯讀事務屬性
超時和唯讀屬性可以在 @transactional 註解中定義.超時屬性以秒為單位來計算.上圖:
在 spring 2.x 事務通知中, 超時和唯讀屬性可以在 元素中進行指定. 上圖:
以上就是sping事務屬性的詳細總結。
文章列表
Spring事務傳播隔離唯讀回滾超時5種屬性詳細
事務5種屬性 1.事務傳播性 propagation 2.事務隔離性 isolation 3.事務回滾屬性 rollbackfor 等 4.事務唯讀屬性 readonly 事務超時屬性 timeout 用 transaction宣告註解方式 例項 1 事務傳播屬性 當事務方法被另乙個事務方法呼叫時,...
spring事務傳播和事務隔離
是最常用的,支援當前事務,若當前沒事務,就新建乙個事務。經測試,左側的事務註解必須得新增,右側的可加可不加 這倆insert事務合併成乙個事務了 支援當前事務,若當前沒事務,就以非事務方式執行。上圖 a調b,a有事務,b事務用supports,ab合併為乙個事務了。ab都會回滾 上圖 a調b,a無事...
spring 事務隔離 與事務傳播 區別
spring的事務隔離級別 isolation default 使用資料庫預設的隔離級別。isolation read uncommitted 允許讀取改變了的還未提交的資料,可能導致髒讀 不可重複讀和幻讀。isolation read committed 允許併發事務提交之後讀取,可以避免髒讀,可...