手工调用Transaction

除了用 @Transactional 外还可以手工调用

PlatformTransactionManager transactionManager = (PlatformTransactionManager)SpringBeanUtil.getBean(PlatformTransactionManager.class);
        DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
        transactionDefinition.setPropagationBehavior(Propagation.REQUIRED.value());
        TransactionStatus transaction = null;

        Object result;
        try {
            transaction = transactionManager.getTransaction(transactionDefinition);
           // 业务代码
            transactionManager.commit(transaction);
            
        } catch (Exception ex) {
            if (null != transaction && !transaction.isCompleted()) {
                transactionManager.rollback(transaction);
            }

            throw ex;
        } finally {
            if (null != transaction && !transaction.isCompleted()) {
                transactionManager.rollback(transaction);
            }

        }

 使用 TransactionTemplate

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.1.0</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <!-- Druid Starter -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

 

    @ConditionalOnMissingBean(TransactionTemplate.class)
    @Bean
    public TransactionTemplate transactionTemplate(@Autowired PlatformTransactionManager transactionManager) {
        return new TransactionTemplate(transactionManager);
    }

    /**
     * DataSource的Bean定义在com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
     * @param dataSource
     * @return
     */
    @Bean
    @ConditionalOnMissingBean(PlatformTransactionManager.class)
    public PlatformTransactionManager transactionManager(@Autowired DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Resource
    TransactionTemplate transactionTemplate;

    public Boolean executeTaskV2(DeductStockTask task) {
        transactionTemplate.setIsolationLevel(TransactionTemplate.ISOLATION_READ_COMMITTED);
        return transactionTemplate.execute(status -> {
            int rows = orderMapper.updateOrderStock(task.getOrderId());
            task.setStatus(rows == task.getItemCount() * 2 ? TaskStatusEnum.SUCCESS : TaskStatusEnum.FAILED);
            task.setFinishTime(new Date());
            if (task.getStatus() == TaskStatusEnum.SUCCESS) {
                task.setMessage("任务执行成功");
                return true;
            } else {
                status.setRollbackOnly(); //回滚
                task.setMessage("库存不足或商品不存在");
                return false;
            }
        });
    }

 

posted @ 2023-12-26 14:05  zslm___  阅读(23)  评论(0)    收藏  举报