1. 程式人生 > >(19)Spring學習記錄---Spring_bean(事物的傳播行為)

(19)Spring學習記錄---Spring_bean(事物的傳播行為)

事物的傳播屬性 

來看一個例子:

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)被掛起,等待第二個事物執行完後,第一個事物繼續,如圖