Spring Boot 中的事务

作者: 右耳菌 | 来源:发表于2022-05-01 21:11 被阅读0次
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属性讲解
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;
    }

如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

相关文章

网友评论

    本文标题:Spring Boot 中的事务

    本文链接:https://www.haomeiwen.com/subject/qycpyrtx.html