Spring入門學習(事務的其它屬性) 第二十一節
阿新 • • 發佈:2019-01-12
Spring入門學習(事務的其它屬性)
事務的隔離級別
- 使用
isolation
指定事務的隔離級別,最常用的取值為READ_COMMITTED
事務的回滾
- 預設情況下Spring 的宣告式事務對所有的執行時異常進行回滾,也可以通過對應的屬性進行設定,通常情況下取預設值即可。
- 此時測試:
由於當前餘額只有30,所以發生異常後事務會回滾,餘額和庫存都不會發生變化。@Test public void testBookShopService() { bookShopService.purchase("AA", "1001"
- 當我們使用
noRollbackFor
指定那些異常不會滾後:
再次執行後,雖然發生了餘額不足的異常,但是1001的庫存還是減少了一個,即@Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.READ_COMMITTED, noRollbackFor={UserAccountException.class})
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
執行結果:執行成功,1001庫存減1本,餘額2900。@Test public void testBookShopService() { bookShopService.purchase("AA", "1001"); }
- 此時將睡眠時間改為5s
Thread.sleep(5000);
,會由於超時而回滾,庫存和餘額都不會發生變化。
測試結果如下: