/**
	 * 添加事务注解
	 * 1. 使用 propagation 指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时,
	 * 2. 如何使用事务,
	 * REQUIRED (默认取值) , 即使用调用方法的事务
	 * REQUIRES_NEW ,必须启动一个新事务,并在自己的事务内运行,
	 * 		如果有事务在运行,就应该先挂起它
	 * 3. 。。。。。
	 * 4. 使用 readOnly 指定事务是否为只读。(如果只是只读,可以不加锁)
	 * 		表示这个事务只读数据包但是不更新数据。
	 * 		这样可以帮助数据库引擎优化事务。
	 * 5. 使用 timeout 指定强制回滚之前,事务可以占用的时间(秒)
	 */

默认:读已提交
@Transactional(isolation=Isolation.READ_COMMITTED)

  • 默认情况下,spring的声明事务对所有的运行时异常进行回滚。
  • 也可以通过对应的属性进行设置
@Service
public class BookShopServiceImp implements BookShopService {

	@Autowired
	private BookShopDao bookShopDao ; 
	
	/** * 添加事务注解 * 使用 propagation 指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时, * 如何使用事务, * REQUIRED (默认取值) , 即使用调用方法的事务 * REQUIRES_NEW ,必须启动一个新事务,并在自己的事务内运行, * 如果有事务在运行,就应该先挂起它 */
	@Transactional(propagation = Propagation.REQUIRES_NEW ,  
			isolation = Isolation.READ_COMMITTED , 
			noRollbackFor = {UserBalanceException.class}) 
	@Override
	public void purchaseBook(String username, String isbn) {
		//1. 书单价
		int price = bookShopDao.findBookPriceByIsbn(isbn);
		
		//2.书库存-1
		bookShopDao.updateBookStockDownByIsbn(isbn);
		
		//3. 用户余额-price
		bookShopDao.updateUserAccount(username, price);
		
	}

	

}

使用 readOnly 指定事务是否为只读。(如果只是只读,可以不加锁)

 * 		表示这个事务只读数据包但是不更新数据。
 * 		这样可以帮助数据库引擎优化事务。
/** * 添加事务注解 * 1. 使用 propagation 指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时, * 2. 如何使用事务, * REQUIRED (默认取值) , 即使用调用方法的事务 * REQUIRES_NEW ,必须启动一个新事务,并在自己的事务内运行, * 如果有事务在运行,就应该先挂起它 * 3. 。。。。。 * 4. 使用 readOnly 指定事务是否为只读。(如果只是只读,可以不加锁) * 表示这个事务只读数据包但是不更新数据。 * 这样可以帮助数据库引擎优化事务。 * * */
	@Transactional(propagation = Propagation.REQUIRES_NEW , 
			isolation = Isolation.READ_COMMITTED , 
			noRollbackFor = {UserBalanceException.class} , 
			readOnly = false) 
	@Override
	public void purchaseBook(String username, String isbn) {
		//1. 书单价
		int price = bookShopDao.findBookPriceByIsbn(isbn);
		
		//2.书库存-1
		bookShopDao.updateBookStockDownByIsbn(isbn);
		
		//3. 用户余额-price
		bookShopDao.updateUserAccount(username, price);
		
	}

备注

select * from book,book_stock where book.isbn=book_stock.isbn;
select * from account ;



----
 update book_stock set stock = 4  ;
update account set balance=300;

isbn1001
bookname=Java
price=100
stock=3
isbn1002
bookname=Oracle
price=70
stock=3
username:AA,balance:130
vedio.dao.UserBalanceException: 用户余额不足...username=AA
-------------
isbn1001
bookname=Java
price=100
stock=3
isbn1002
bookname=Oracle
price=70
stock=3
username:AA,balance:130