<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency><!--mysql-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency><dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency><!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency><dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency><dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency><dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency><dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>2、model
可通过逆向工程进行配置,参考idea+mybatis逆向工程
4、dao
public interface StockMapper {Stock checkStock(Integer id);//校验库存
int updateSale(Stock stock);//扣除库存
}public interface StockOrderMapper {//创建订单
void createOrder(StockOrder order);
}5、sql
商品校验和减库存
下订单6、servicepublic interface StockOrderService {
public Integer createOrder(Integer id);
}7、实现
@Service
public class StockOrderServiceImpl implements StockOrderService {
@Autowired
private StockOrderMapper stockOrderMapper;@Autowired
private StockMapper stockMapper;@Override
@Transactional(rollbackFor = Exception.class)
public Integer createOrder(Integer id) {
//校验库存
Stock stock = checkStock(id);
if(stock.getCount()>0){
System.out.println("当前库存:" + stock.getCount());
//扣库存
if(updateSale(stock) == 1){
return createOrder(stock);
}else {
return 0;
}
}
return 0;
}//校验库存
private Stock checkStock(Integer id) {
return stockMapper.checkStock(id);
}//扣库存
private int updateSale(Stock stock){
return stockMapper.updateSale(stock);
}//下订单
private Integer createOrder(Stock stock){
StockOrder order = new StockOrder();
order.setSid(stock.getId());
order.setCreateTime(new Date());
order.setName(stock.getName());
stockOrderMapper.createOrder(order);
return order.getId();
}
}8、测试
模拟100人参与活动@SpringBootTest
class MsServerApplicationTests {
@Autowired
private StockOrderService stockOrderService;@Test
void contextLoads() throws InterruptedException {// 库存初始化为10,这里通过CountDownLatch和线程池模拟100个并发
int threadTotal = 100;ExecutorService executorService = Executors.newCachedThreadPool();
final CountDownLatch countDownLatch = new CountDownLatch(threadTotal);
for (int i = 0; i < threadTotal ; i++) {
int uid = i;
executorService.execute(() -> {
try {
stockOrderService.createOrder(1);
} catch (Exception e) {
e.printStackTrace();
}
countDownLatch.countDown();
});
}countDownLatch.await();
executorService.shutdown();}
}9、结果
商品表
订单表
到此这篇关于基于mysql乐观锁实现秒杀的示例代码的文章就介绍到这了,更多相关mysql乐观锁秒杀内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!