Spring 事務 學習

2022-08-12 21:00:22 字數 2311 閱讀 8415

事務就是一系列的動作,它們被當作乙個單獨的工作單元。這些動作要麼全部完成,要麼全部不起作用

事務的四個關鍵屬性(acid)

1 原子性(atomicity)

事務室乙個原子操作,有一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用

2 一致性(consistency)

一旦所有事務動作完成,事務就被提交。資料和資源就處於一種滿足業務規則的一致性狀態中

3 隔離性(isolation)

可能有許多事務會同時處理相同的資料,因此每個事物都應該與其他事務隔離開來,防止資料損壞

4 永續性(durability)

一旦事務完成,無論發生什麼系統錯誤,它的結果都不應該受到影響。通常情況下,事務的結果被寫到持久化儲存器中      

spring既支援程式設計式事務管理,也支援宣告式的事務管理

1 程式設計式事務管理

將事務管理**嵌入到業務方法中來控制事務的提交和回滾,在程式設計式事務中,必須在每個業務操作中包含額外的事務管理**

2 宣告式事務管理:

大多數情況下比程式設計式事務管理更好用。它將事務管理**從業務方法中分離出來, 以宣告的方式來實現事務管理。事務管理作為一種橫切關注點,可以通過aop方法模組化。spring通過aop框架支援宣告式事務管理。

當事務方法被另乙個事務方法呼叫時,必須指定事務應該如何傳播

例如:方法可能繼續在現有事務中執行,也可能開啟乙個新事務,並在自己的事務中執行。

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

1 propagation_mandatory 

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

2 propagation_nested

表示如果當前已經存在乙個事務,那麼該方法將會在巢狀事務中執行。 巢狀的事務可以獨立於當前事務進行單獨地提交或回滾。如果當前事務不存在,那麼其行為與propagation_required一樣。注意各廠商對這種傳播行為的支援是有所差異的。可以參考資源管理器的文件來確認它們是否支援巢狀事務

3 propagation_never     

表示當前方法不應該執行在事務上下文中。如果當前正有乙個事務在執行,則會丟擲異常

4 propagation_not_supported

表示該方法不應該執行在事務中。如果存在當前事務,在該方法執行期間,當前事務將

被掛起。如果使用jtatransactionmanager的話,則需要訪問transactionmanager  

5 propagation_required  

表示當前方法必須執行在事務中。如果當前事務存在,方法將會在該事務中執行。否則,會啟動乙個新的事務

6 propagation_required_new

表示當前方法必須執行在它自己的事務中。乙個新的事務將被啟動。如果存在當前事務,在該方法執行期間,

當前事務會被掛起。如果使用jtatransactionmanager的話,則需要訪問transactionmanager

7 propagation_supports 

表示當前方法不需要事務上下文,但是如果存在當前事務的話,那麼該方法會在這個事務中執行

*其中propagation_required為預設的傳播屬性*

在同乙個應用程式或者不同應用程式中的多個事務在同乙個資料集上併發執行時,可能會出現許多意外的問題。

併發事務所導致的問題可以分為以下三類:

1 髒讀     髒讀發生在乙個事務讀取了另乙個事務改寫但尚未提交的資料時。如果改寫在稍後被回滾了,那麼第乙個事務獲取的資料就是無效的。

2 不可重複讀  不可重複讀發生在乙個事務執行相同的查詢兩次或兩次以上,但是每次都得到不同的資料時。這通常是因為另乙個併發事務在兩次查詢期間更新了資料

3 幻讀     幻讀與不可重複讀類似。它發生在乙個事務(t1)讀取了幾行資料,接著另乙個併發事務(t2)插入了一些資料時。在隨後的查詢中, 第乙個事務(t1)就會發現多了一些原本不存在的記錄

spring自帶的事務隔離級別屬性

1 isolation.read_uncommitted  讀取未提交資料(會出現髒讀,不可重複讀)基本不使用

2 isolation.read_committed      讀取已提交資料(會出現不可重複讀和幻讀)

3 isolation.repeatable_read     可重複讀(會出現幻讀)

4 isolation.serializable       序列化(最高端別)

******     mysql: 預設為repeatable_read級別  ******

******    sqlserver: 預設為read_committed  ******

spring再學習(二) spring事務

與關係型資料庫一致,事務都遵循 acid 原則 spring支援程式設計式事務管理以及宣告式事務管理兩種方式。在spring框架,用註解開啟事務 transactional,當然事務有其特性 spring事務的傳播行為有7種 spring在事務中使用isolation來配置它 isolation r...

Spring事務學習筆記(一)

事務是邏輯上的一組操作,這組操作要麼全部成功,要麼全部失敗。舉例 銀行系統a向b轉帳,分為兩個階段,第乙個階段從a賬戶中扣錢,第二個階段向b賬戶中轉錢,這就是乙個事務,需要保證只有這兩個階段都成功執行了才算整個事務成功執行,如果第乙個階段成功,第二個階段失敗,那麼事務也是失敗,需要回滾到這次事務開始...

spring學習筆記(4) spring事務管理

對事務的理解 事務是指修改資料庫資料時,需要滿足所有的操作要滿足一致性,要麼全都操作,要麼全都不操作。例如,當我買乙個商品時,大致的步驟如下 1.資料庫中商品的數量減一 2.我的賬戶餘額減去商品的 當執行到第二步時,若發現我的餘額不夠支付該商品,本次購買便失敗,系統應該恢復原來的商品數量 即需要回滾...