1.问题

  1、以前对事物的了解只是停留在声明式事物,配置xml,或使用注解,事物的传播行为也只用过REQUIRED和SUPPORTS,可以说对事物的了解很模糊。

  2、直到在开发中遇到问题。。

    问题的描述是:

      年底跑定时任务,获取用户年底过期积分,并发送积分即将过期的消息提示;

      过期积分做记录,并与积分做关联记录,涉及两表的操作;

      数据量较多,循环保存,要做到每次循环都会手动提交,而不是做缓存最后提交;

      事物的传播行为为默认的REQUIRED,二两个表操作涉及到了嵌套事物;

      So。。。

    解决办法:

      1声明式事物方式

       @Transactional(propagation = Propagation.REQUIRES_NEW) 

      2采用了编程式事物

      事物的传播行为选择为:PROPAGATION_REQUIRES_NEW

public boolean updateExpireCredit(Credit credit) throws Exception {
        // 事务开始-方法级别
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        // 传播行为: 新建事务,如果当前存在事务,把当前事务挂起
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        def.setTimeout(30);
        // 事务状态
        TransactionStatus status = tm.getTransaction(def);
        boolean falg = false;
        try {
            creditRepository.save(credit);
            tm.commit(status);
            falg = true;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("出现异常,事务回滚:{}", e);
            if (!status.isCompleted()) {
                tm.rollback(status);
            }
            throw e;
        }
        return falg;
    }
View Code

相关文章:

  • 2022-12-23
  • 2021-07-04
  • 2022-02-26
  • 2021-10-29
猜你喜欢
  • 2021-12-24
  • 2022-12-23
  • 2021-12-07
  • 2021-11-30
  • 2023-03-03
  • 2021-12-21
相关资源
相似解决方案