1. 程式人生 > >Spring入門學習(事務的其它屬性) 第二十一節

Spring入門學習(事務的其它屬性) 第二十一節

Spring入門學習(事務的其它屬性)

事務的隔離級別

  1. 使用 isolation指定事務的隔離級別,最常用的取值為 READ_COMMITTED

事務的回滾

  1. 預設情況下Spring 的宣告式事務對所有的執行時異常進行回滾,也可以通過對應的屬性進行設定,通常情況下取預設值即可。
  2. 此時測試:
    @Test
    public void testBookShopService() {
    	bookShopService.purchase("AA", "1001"
    ); }
    由於當前餘額只有30,所以發生異常後事務會回滾,餘額和庫存都不會發生變化。
  3. 當我們使用noRollbackFor指定那些異常不會滾後:
    @Transactional(propagation=Propagation.REQUIRES_NEW, 
    	isolation=Isolation.READ_COMMITTED, 
    	noRollbackFor={UserAccountException.class})
    
    再次執行後,雖然發生了餘額不足的異常,但是1001的庫存還是減少了一個,即UserAccountException異常不會回滾,通常情況下取預設值即可。

事務的只讀屬性和過期時間

  1. 使用readOnly指定事務是否為只讀,表示這個事務只讀取但不進行更新,這樣可以幫助資料庫引擎優化事務。若真的只是一個讀取資料庫值的方法,應設定readOnly=true
  2. 使用 timeout指定強制回滾之前事務可以佔用的時間。
  3. 修改AA餘額為3000,超時時間timeout =3purchase中睡眠2s,此時可以購買成功。
    @Transactional(propagation=Propagation.REQUIRES_NEW, 
    		isolation=Isolation.READ_COMMITTED,
    		readOnly=false,
    		timeout=3)
    @Override
    public void purchase(String username, String isbn) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } // 1.獲取書的單價 int price = bookShopDao.findBookPriceByIsbn(isbn); // 2.更新書的庫存 bookShopDao.updateBookStock(isbn); // 3.更新使用者餘額 bookShopDao.updateUserAccount(username, price); }
    測試方法:
    @Test
    public void testBookShopService() {
    	bookShopService.purchase("AA", "1001"); 
    }
    
    執行結果:執行成功,1001庫存減1本,餘額2900。
  4. 此時將睡眠時間改為5sThread.sleep(5000);,會由於超時而回滾,庫存和餘額都不會發生變化。
    測試結果如下:
    在這裡插入圖片描述