使用isolation
指定事務的隔離級別,最常用的取值為read_committed
預設情況下spring 的宣告式事務對所有的執行時異常進行回滾,也可以通過對應的屬性進行設定,通常情況下取預設值即可。
此時測試:
@test
public
void
testbookshopservice()
由於當前餘額只有30,所以發生異常後事務會回滾,餘額和庫存都不會發生變化。
當我們使用norollbackfor
指定那些異常不會滾後:
@transactional
(propagation=propagation.requires_new,
isolation=isolation.read_committed,
norollbackfor=
)
再次執行後,雖然發生了餘額不足的異常,但是1001的庫存還是減少了乙個,即useraccountexception
異常不會回滾,通常情況下取預設值即可。
使用readonly
指定事務是否為唯讀,表示這個事務只讀取但不進行更新,這樣可以幫助資料庫引擎優化事務。若真的只是乙個讀取資料庫值的方法,應設定readonly=true
。
使用timeout
指定強制回滾之前事務可以占用的時間。
修改aa餘額為3000,超時時間timeout =3
,purchase
中睡眠2s,此時可以購買成功。
@transactional
(propagation=propagation.requires_new,
isolation=isolation.read_committed,
readonly=
false
, timeout=3)
@override
public
void
purchase
(string username, string isbn)
catch
(interruptedexception e)
// 1.獲取書的單價
int price = bookshopdao.
findbookpricebyisbn
(isbn)
;// 2.更新書的庫存
bookshopdao.
updatebookstock
(isbn)
;// 3.更新使用者餘額
bookshopdao.
updateuseraccount
(username, price)
;}
測試方法:@test
public
void
testbookshopservice()
執行結果:執行成功,1001庫存減1本,餘額2900。
此時將睡眠時間改為5sthread.sleep(5000);
,會由於超時而回滾,庫存和餘額都不會發生變化。
測試結果如下:
Spring 事務 學習
事務就是一系列的動作,它們被當作乙個單獨的工作單元。這些動作要麼全部完成,要麼全部不起作用 事務的四個關鍵屬性 acid 1 原子性 atomicity 事務室乙個原子操作,有一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用 2 一致性 consistency 一旦所有事務動作完成...
spring入門到放棄 spring事務管理
spring事務提供了兩種管理的的方式 程式設計式事務和宣告式事務 簡單回顧下事務 事務 邏輯上的一組操作,組成操作的各個單元,要麼全部成功,要麼全部失敗。事務特性 原子性 乙個事務包含的各個操作單元不可分割 一致性 事務執行前後資料應當保持一致 隔離性 乙個事務的執行不應當受到其他事務的干擾 永續...
spring再學習(二) spring事務
與關係型資料庫一致,事務都遵循 acid 原則 spring支援程式設計式事務管理以及宣告式事務管理兩種方式。在spring框架,用註解開啟事務 transactional,當然事務有其特性 spring事務的傳播行為有7種 spring在事務中使用isolation來配置它 isolation r...