• @Transactional 注意事项


    PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启。

    PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

    PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

    PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务存在,则将这个存在的事务挂起。

    PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

    PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常。

    PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行

    PROPAGATION_REQUIRED

    无异常 一起提交
    有异常 一起回滚
    嵌套方法不会提前提交

    @Transactional(rollbackFor = Exception.class)
    public void updateTask() {
         try {
             jobTaskService.updateTask2();
         }catch (Exception e){
    
         }
         YxUser one = userService.lambdaQuery().eq(YxUser::getPhone, "11111").one();
         userService.lambdaUpdate().eq(YxUser::getPhone, "11111").set(YxUser::getNickname, one.getNickname() + "22222").update();
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
    public void updateTask2() {
        userService.lambdaUpdate().eq(YxUser::getPhone, "11111").set(YxUser::getNickname, "100000").update();
    }
    
    • 1
    • 2
    • 3
    • 4

    PROPAGATION_REQUIRES_NEW

    无异常 嵌套方法先提交
    有异常 嵌套方法回滚 不影响主方法提交
    注意 两个方法在不同的类 否则会不走代理 直接通过this.嵌套方法调用 不走代理 导致注解无效

    @Transactional(rollbackFor = Exception.class)
    public void updateTask() {
       try {
           jobTaskService.updateTask2();
       }catch (Exception e){
    
       }
       YxUser one = userService.lambdaQuery().eq(YxUser::getPhone, "11111").one();
       userService.lambdaUpdate().eq(YxUser::getPhone, "11111").set(YxUser::getNickname, one.getNickname() + "1").update();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public void updateTask2() {
         YxUser one = userService.lambdaQuery().eq(YxUser::getPhone, "11111").one();
         userService.lambdaUpdate().eq(YxUser::getPhone, "11111").set(YxUser::getNickname, "10011100").update();
         throw new RuntimeException("");
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ReentrantLock lock = new ReentrantLock();

    注意事务和锁一起使用

    spring的事务提交是在方法结束后执行的 解锁之后可能还没提交 又有线程进入 导致脏读问题

    对于高并发加事务问题 可以对事务手动处理

    //事务管理器
    @Autowired
    private PlatformTransactionManager platformTransactionManager;
    
    //默认事务定义
    @Autowired
    private TransactionDefinition transactionDefinition;
    
    //创建自定义锁
    DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
    defaultTransactionDefinition.setPropagationBehavior(1);
    //开始事务
    TransactionStatus transaction = platformTransactionManager.getTransaction(defaultTransactionDefinition);
    //事务提交
    platformTransactionManager.commit(transaction);
    //事务回滚
    platformTransactionManager.rollback(transaction);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    springboot昆明学院档案管理系统 毕业设计-附源码311758
    openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库
    【linux】进程创建,进程终止
    长连接和短连接
    挑战10个最难回答的Java面试题(附答案)
    Elasticsearch的分析与分析器
    MATLAB中的脚本和函数有什么区别?
    【Transformers】预训练模型使用工具Transformer(2):文本分词
    Eureka Server 实现在线扩容
    失业登记对养老保险是否有影响
  • 原文地址:https://blog.csdn.net/qq_44407005/article/details/127851816