spring--(27)事务的隔离级别/回滚/只读/过时

当同一个应用程序或者不一样应用程序的多个事务在同一个数据集上并发操做时,可能会引发以下的问题,简称为并发事务所致使的问题:
1.脏读:对于两个事务T1和T2,T1读取了已经被T2更新但未提交(保存)的自断后,若T2出现回滚,则T1读取的内容是临时无效的。
2.不可重复读:对于两个事务T一、T2,T1读取了一个字段,而后T2更新了该字段,接着T1再次读取同一字段,值不一样了。对于T1而言,就出现问题了,一次网络请求,可是T1两次读取同一字段值不同。
3.幻读:对于两个事务T一、T2,T1从一个表中读取了一个字段,T2向该表中插入了一些新的行,以后T1再次读取同一个表,则会多出几行。数据库

//声明式事务
	//1.使用propagation指定事务的传播行为
	//默认状况下使用外部整体事务,即便用REQUIRED
	//REQUIRES_NEW:使用本身的事务,外部事务被挂起
	//---------
	//2.使用isolation指定事务的隔离级别,经常使用的是READ_COMMITTED
	//3.使用noRollbackFor/RollbackFor指定事务的回滚,默认状况下 sring的声明式事务对全部的运行时异常进行回滚,也能够经过对应的属性进行设置
	//3.1 忽略UserBalanceException,即noRollbackFor={UserBalanceException.class},该异常不回滚
	//4.使用readOnly属性指定事务是否为只读,若是设置成true,表示这个事务只读取数据不更新数据,这样 能够帮助数据库引擎优化事务。
	//5.使用timeOut指定强制回滚以前事务能够占用的时间,好处是不让这个事务占用过长的时间
	@Transactional(propagation=Propagation.REQUIRES_NEW,
			isolation=Isolation.READ_COMMITTED,
			//noRollbackFor={UserBalanceException.class}
			readOnly =false,
			timeout = 1)
	@Override
	public void purchase(int userId, int bookId) {
		
		//1.获取书的单价
		double price = bookShopDao.getBookPriceByBookId(bookId);
		System.out.println(price);
		//2.更新书的数量
		bookShopDao.updateBookStock(bookId);
		//3.更新用户余额
		bookShopDao.updateUserBalance(userId, price);
	}
相关文章
相关标签/搜索