手工调用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; } }); }

浙公网安备 33010602011771号