(19)Spring學習記錄---Spring_bean(事物的傳播行為)
阿新 • • 發佈:2019-01-03
事物的傳播屬性
來看一個例子:
1.繼上一章的專案,新建一個業務類 ,該類下有一個購買多本書的方法
Cashier.class
public interface Cashier {
//一個使用者購買多本書
public void checkout(String username,List<String> isbns);
}
CashierImpl.java
通過@Transactional標記該方法
@Service("cashier") public class CashierImpl implements Cashier{ @Autowired private BookService bookService; @Transactional @Override public void checkout(String username, List<String> isbns) { for(String isbn:isbns) bookService.purchase(username, isbn); } }
2.在Junit測試類(SpringTransactionTest.java)下新增測試方法
//測試方法 一個使用者買多本書
@Test
public void testTranscationPropagation() {
cashier.checkout("aa", Arrays.asList("1001","1002"));
}
3.修改SpringTransactionTest.java方法
@Service("bookService") public class BookServiceImpl implements BookService { @Autowired private BookShopDAO bookShopdDAO; //新增事物註解 //使用propagation定義傳播行為,即當前事物方法被另外的事物呼叫時 //如何使用事務,是繼續在當前事物下使用,還是新建一個事物。預設值為REQUIRED在當前事物下執行 //REQUIRED_NEW 使用自己的事物,當前事物被掛起 @Transactional(propagation=Propagation.REQUIRED) @Override public void purchase(String username, String isbn) { //獲取書單價 int price = bookShopdDAO.findbookPriceByIsbn(isbn); //更新庫存 bookShopdDAO.updateBookNum(isbn); //使用者餘額減 bookShopdDAO.updateUserAccount(username, price); } }
4.考慮一種情況,若當前使用者的錢只夠買一本書,那麼結果有兩種
①使用者購買了一本,放棄了另一本
②使用者兩本都沒有買
5.測試
①當propagation=REQUIRED的情況下,且餘額只夠買一本
執行前
執行後
丟擲異常
解釋:當propagation=REQUIRED時,事物直接回滾到事物開始的地方,看圖
② 當propagation=REQUIRES_NEW時,且餘額只夠買一本
執行前
執行後
結果:可以看到庫存而餘額已經更新
解釋:當propagation=REQUIRES_NEW時,第二事物(CashierImpl.checkout)執行時,第一個事物(BookServiceImpl》purchase)被掛起,等待第二個事物執行完後,第一個事物繼續,如圖