Transactional注解规范使用

发布时间:2024年01月19日

#创作灵感

在进行编码规范扫描时候,提示

事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。

这里就查阅 @Transactional这个注解

#为什么会提示有问题呢?

我们在实现类上对于增删改上加上@Transactional注解,Spring框架的事务基础架构代码将默认地 只 在抛出运行时unchecked exceptions时才标识事务回滚

🐂🐂🐂??? 🐎🐎🐎?? ???
也就是说,当抛出个RuntimeException?或其子类例的实例时。(Errors?也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 ****不 被标识进行事务回滚。

1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

#如何解决异常被try{}catch{}了,就不回滚了

比如:下面这样抛异常就不会回滚
 @Override
    @Transactional
    public Json addOrder(TOrderAddReq tOrderAddReq) {
        try{
                //增删改方法
        } catch (Exception e) {
            .....
            e.printStackTrace();}
//        }
        return json;
    }
解决上面办法是直接手动硬执行
@Override
@Transactional
public Json addOrder(TOrderAddReq tOrderAddReq) {
  try{
    //增删改方法
     } catch (Exception e) {
      // 手动硬编码开启spring事务管理
       TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        e.printStackTrace();
        }
        return json;
    }
或者在catch中抛指定异常
 @Override
    @Transactional
    public Json addOrder(TOrderAddReq tOrderAddReq) {
        try{
                //增删改方法
        } catch (Exception e) {
            
            throw new RuntimeException();
            }
        return json;
    }

#重点来了

@Transactional不做任何配置 默认是对抛出的unchecked异常回滚,checked异常不会回滚,为了让所有异常都会让事务启动可以将 @Transactional配置为 @Transactional(rollbackFor = Exception.class)

文章来源:https://blog.csdn.net/weixin_51309915/article/details/135703084
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。