BookShopDao接口

public interface BookShopDao {	//根据书号获取书的单价	public int findBookPriceByIsbn(String isbn);		//更新书的库存,使书号对应的库存-1	public void updateBookStock(String isbn);		//更新用户的账户余额,是username的balance-price	public void updateUserAccount(String username, int price);}

BookShopDao接口的实现类

public class BookShopImpl implements BookShopDao{	private JdbcTemplate jdbcTemplate;	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {		this.jdbcTemplate = jdbcTemplate;	}	@Override	public int findBookPriceByIsbn(String isbn) {		String sql = "select price from book where isbn = ?";		return jdbcTemplate.queryForObject(sql, Integer.class, isbn);	}	@Override	public void updateBookStock(String isbn) {		//检查书的库存是否足够,若不够,则抛异常		String s = "select stock from book_stock where isbn = ?";		int stock = jdbcTemplate.queryForObject(s, Integer.class, isbn);		//System.out.println("stock:" + stock);		if (stock <= 0) {			throw new BookStockException("库存不足");		}		String sql = "update book_stock set stock = stock -1 where isbn = ?";		jdbcTemplate.update(sql, isbn);	}	@Override	public void updateUserAccount(String username, int price) {		//验证余额不否足够。若余额不足则抛出异常		String s = "select balance from account where username = ?";		int balance = jdbcTemplate.queryForObject(s, Integer.class, username);		if (balance < price) {			//System.out.println("余额不足");			throw new UserAccountException("余额不足");		}		String sql = "update account set balance = balance - ? where username = ?";		jdbcTemplate.update(sql, price, username);	}}

BookStockException.java和UserAccountException.java为自定义的两个异常类,继承RuntimeException。

BookShopService接口

public interface BookShopService {	public void purchase(String username, String isbn);}

BookShopService接口的实现类

public class BookShopServiceImpl implements BookShopService{	private BookShopDao bookShopDao;	public void setBookShopDao(BookShopDao bookShopDao) {		this.bookShopDao = bookShopDao;	}		@Override	public void purchase(String username, String isbn) {		/*		try {			Thread.sleep(5000);		} catch (InterruptedException e) {			e.printStackTrace();		}		*/		//获取书的单价		int price = bookShopDao.findBookPriceByIsbn(isbn);		//更新书的库存		bookShopDao.updateBookStock(isbn);		//更新用户余额		bookShopDao.updateUserAccount(username, price);	}}

applicationContext.xml配置

 
 
 
   
 
 
   

测试

        @Test	public void testTransactionalPropagation() {		cashier.checkout("umgsai", Arrays.asList("1001", "1002"));	}