声明式事务属性
timeout-int(秒为单位):超时,事务超出指定时间自动终止并回滚
@Transactional(timeout=3)
public void checkout(String username,String isbn) throws InterruptedException{
//减库存
bookDao.updateStock(isbn);
//线程休眠4秒
Thread.sleep(4000);
//查询书本价格
Integer price = bookDao.getPrice(isbn);
//减余额
bookDao.updateBalance(username, price);
}
readOnly-boolean:设置事务为只读事务,可以加快查询速度,不用管事务那一堆操作
@Transactional(readOnly=false)//如果为true则只能进行查询
public void checkout(String username,String isbn) throws InterruptedException{
//减库存
bookDao.updateStock(isbn);
//查询书本价格
Integer price = bookDao.getPrice(isbn);
//减余额
bookDao.updateBalance(username, price);
}
回滚控制属性
异常的分类:
- 运行时异常(非检查异常):可以不用处理,默认回滚
- 编译时异常(检查异常):默认不回滚
noRollbackFor-Class[]:哪些事务可以不回滚(可以让原来回滚的异常设置成不回滚)
/*
* 异常的分类:
* 运行时异常(非检查异常):可以不用处理,默认回滚
* 编译时异常(检查异常):默认不回滚
* noRollbackFor-Class[]:哪些事务可以不回滚(可以让原来回滚的异常设置成不回滚) * noRollBackForClassName-String[](Stirng全类名):这个与上面方法一样,只不过参数是全类名
*/
//设置算数异常与空指针异常不回滚
@Transactional(noRollbackFor={ArithmeticException.class,NullPointerException.class})
public void checkout(String username,String isbn) throws InterruptedException{
//减库存
bookDao.updateStock(isbn);
//查询书本价格
Integer price = bookDao.getPrice(isbn);
//减余额
bookDao.updateBalance(username, price);
//手动设置运行时异常
int a = 10/0;
}
运行时异常本身会回滚,但是设置以后将不会回滚,数据库数据将被改变。
roolbackFor-Class[]:哪些异常事务需要回滚(原本编译时异常不回滚,可以让它回滚)
/*
* roolbackFor-Class[]:哪些异常事务需要回滚(原本编译时异常不回滚,可以让它回滚)
* roolbackForClassName-String[]:跟上面作用一样,只不过参数是全类名
*/
//设置FileNotFoundException回滚
@Transactional(rollbackFor={FileNotFoundException.class})
public void checkout(String username,String isbn) throws InterruptedException, FileNotFoundException{
//减库存
bookDao.updateStock(isbn);
//查询书本价格
Integer price = bookDao.getPrice(isbn);
//减余额
bookDao.updateBalance(username, price);
//设置编译时异常,这个文件是不存在的
new FileInputStream("D:aaa.xxx");
}
此时编译时异常默认是不回滚的,设置为回滚后,出现相关异常,将会回滚,数据库不会改变。
隔离级别
isolation:设置隔离级别,根据业务的特性来设置隔离级别
/**
* isolation:设置隔离级别,根据业务的特性来设置隔离级别
* @param isbn
* @return
*/
@Transactional(readOnly=true,isolation=Isolation.READ_UNCOMMITTED)
public int getPrice(String isbn){
return bookDao.getPrice(isbn);
}