1. @Transactional 注解的基本知识
- SpringBoot开启事务的注解,可以用于修饰方法或类,被修饰的方法和类将默认开启数据库事务,如果类和方法都存在该注解,则根据最近原则,此时方法上的@Transactional 注解会覆盖 类上的@Transactional 注解。
2. @Transactional 中的属性讲解
- 属性表格讲解
参数 | 功能 |
---|---|
readOnly | 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如: @Transactional(readOnly=true),可以使用在只有查询的方法上边,用以提升效率,避免增删改的操作(会报错) |
rollbackFor (推荐) |
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如: 指定单一异常类:@Transactional(rollbackFor=RuntimeException.class) 指定多个异常类:默认是什么? |
rollbackForClassName (不推荐) |
该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如︰ 指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException") 指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException",”Exception"}) |
noRollbackFor (推荐) |
该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如: 指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class) 指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class,Exception.class) |
noRollbackForClassName (不推荐) |
该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。 例如: 指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException") 指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException","Exception”) |
propagation | 该属性用于设置事务的传播行为。 例如:@Transactional(propagation=Propagation.NOT_SUPPORTED) |
timeout | 该属性用于设置事务的超时秒数,默认值为-1表示永不超时,如果超出设置的时间,则会抛出异常 ,并回滚操作,可以避免出现长时间的等待的情况 |
isolation | 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置 |
- propagation 属性讲解
属性 | 描述 |
---|---|
@Transactional(propagation=Propagation.REQUIRED) (常用) |
如果有事务,那么加入事务,没有的话新建一个(默认情况下) |
@Transactional(propagation=Propagation.NOT_SUPPORTED) | 容器不为这个方法开启事务 |
@Transactional(propagation=Propagation.REQUIRES_NEW) (常用) |
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务 |
@Transactional(propagation=Propagation.MANDATORY) (常用) |
必须在一个已有的事务中执行,否则抛出异常 |
@Transactional(propagation=Propagation.NEVER) | 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反) |
@Transactional(propagation=Propagation.SUPPORTS) | 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务 |
- timeout属性讲解
内容 | 解释 |
---|---|
基本描述 | 设置事务的超时时间,单位秒 |
属性解释 | 当某个业务运行的时间超过你的预期时,可以使用该属性来让该业务抛出异常并且强制回滚 |
应用场合 | 比如银行业务中,当用户进行取现出票失败时,可以使用该属性来强制结束业务,进行回滚,减少用户等待的时间 |
- isolation属性讲解

3. 例子
- 订单和库存的案例,即 创建一个订单 时,库存数量 必须对应减少,此必须为一个事务
@Transactional
public OrderItem placeOrder(OrderItem orderItem){
// 创建订单
orderItemRepository.insertOrderItem(orderItem);
//扣减库存, 仅剩余数量满足扣除时,updateRows会返回大于0的结果
int updateRows = goodStockRepository.reduceStock(orderItem.getGoodsId(), orderItem.getCount);
if(updateRows <= 0){
throw new IllegalArgumentException("下单失败,库存不足!");
}
// 查询最新插入的一条记录
OrderItem orderItemByNear = orderItemRepository.findOrderItemByNear();
return orderItemByNear;
}
如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~
网友评论