当前位置: 首页 > wzjs >正文

响应式网站 手机站培训类网站建设

响应式网站 手机站,培训类网站建设,做问卷调查的网站,网站系统建设系广告经营者什么是超卖?假如只剩下一个库存,却被多个订单买到了,简单理解就是库存不够了还能正常下单。 方案1:数据库行级锁 1. 实体类 Data TableName("product") public class Product {TableId(type IdType.AUTO)private Lon…

什么是超卖?假如只剩下一个库存,却被多个订单买到了,简单理解就是库存不够了还能正常下单。


方案1:数据库行级锁

1. 实体类

@Data
@TableName("product")
public class Product {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer stock;@Version // MyBatis-Plus乐观锁注解private Integer version;
}

2. Mapper接口

public interface ProductMapper extends BaseMapper<Product> {/​**​* 使用悲观锁查询商品* @param id 商品ID* @return 商品实体*/@Select("SELECT * FROM product WHERE id = #{id} FOR UPDATE")Product selectByIdWithLock(Long id);/​**​* 自定义乐观锁更新方法* @param product 商品实体* @param oldVersion 旧版本号* @return 更新影响行数*/@Update("UPDATE product SET stock = #{stock}, version = version + 1 " +"WHERE id = #{id} AND version = #{oldVersion}")int updateWithOptimisticLock(Product product, @Param("oldVersion") int oldVersion);
}

3. Service层实现

@Service
@RequiredArgsConstructor
public class ProductService {private final ProductMapper productMapper;/​**​* 使用行级锁扣减库存* @param productId 商品ID* @param quantity 扣减数量* @return 操作结果*/@Transactional(rollbackFor = Exception.class)public String reduceStock(Long productId, Integer quantity) {try {// 1. 加行级锁查询商品Product product = productMapper.selectByIdWithLock(productId);if (product == null) {return "商品不存在";}// 2. 检查库存是否充足if (product.getStock() < quantity) {return "库存不足";}// 3. 扣减库存product.setStock(product.getStock() - quantity);// 4. 更新库存int result = productMapper.updateById(product);if (result <= 0) {throw new RuntimeException("更新库存失败");}return "扣减库存成功";} catch (Exception e) {// 事务回滚throw new RuntimeException("扣减库存异常: " + e.getMessage());}}/​**​* 使用MyBatis-Plus内置乐观锁机制扣减库存* @param productId 商品ID* @param quantity 扣减数量* @return 操作结果*/@Transactional(rollbackFor = Exception.class)public String reduceStockWithOptimisticLock(Long productId, Integer quantity) {// 1. 查询商品(不加锁)Product product = productMapper.selectById(productId);if (product == null) {return "商品不存在";}// 2. 检查库存if (product.getStock() < quantity) {return "库存不足";}// 3. 扣减库存product.setStock(product.getStock() - quantity);// 4. 乐观锁更新int result = productMapper.updateById(product);if (result <= 0) {// 版本号不一致,说明数据已被修改return "操作失败,请重试";}return "扣减库存成功";}/​**​* 手动实现乐观锁扣减库存(带重试机制)* @param productId 商品ID* @param quantity 扣减数量* @return 操作结果*/@Transactional(rollbackFor = Exception.class)public String reduceStockManual(Long productId, int quantity) {// 1. 查询商品Product product = productMapper.selectById(productId);if (product == null) {return "商品不存在";}// 2. 检查库存是否充足if (product.getStock() < quantity) {return "库存不足";}// 3. 扣减库存product.setStock(product.getStock() - quantity);// 4. 手动乐观锁更新int result = productMapper.updateWithOptimisticLock(product, product.getVersion());if (result > 0) {return "扣减库存成功";}return "操作失败,请重试";}
}

方案2:分布式锁

1. 实体类

@Data
@TableName("product")
public class Product {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer stock;
}

2. Mapper接口

public interface ProductMapper extends BaseMapper<Product> {// 使用MyBatis-Plus自带方法/​**​* 自定义扣减库存方法* @param productId 商品ID* @param quantity 扣减数量* @return 影响行数*/@Update("UPDATE product SET stock = stock - #{quantity} WHERE id = #{productId} AND stock >= #{quantity}")int reduceStock(@Param("productId") Long productId, @Param("quantity") int quantity);
}

3. Service层实现

@Service
@RequiredArgsConstructor
public class ProductService {private final ProductMapper productMapper;private final RedissonClient redissonClient;/​**​* Redisson分布式锁*/public String reduceStockWithLock(Long productId, int quantity) {// 1. 创建分布式锁keyString lockKey = "product:lock:" + productId;RLock lock = redissonClient.getLock(lockKey);try {// 2. 尝试获取锁(等待5秒,锁自动释放时间30秒)boolean locked = lock.tryLock(5, 30, TimeUnit.SECONDS);if (!locked) {return "系统繁忙,请稍后再试";}try {// 3. 查询商品Product product = productMapper.selectById(productId);if (product == null) {return "商品不存在";}// 4. 检查库存是否充足if (product.getStock() < quantity) {return "库存不足";}// 5. 扣减库存int result = productMapper.reduceStock(productId, quantity);if (result <= 0) {return "扣减失败,请重试";}return "扣减成功";} finally {// 6. 释放锁// lock.isLocked()检查锁是否仍然被持有(未被释放)// lock.isHeldByCurrentThread()检查当前线程是否持有该锁if (lock.isLocked() && lock.isHeldByCurrentThread()) {lock.unlock();}}} catch (InterruptedException e) {Thread.currentThread().interrupt();return "系统异常,请重试";}}
}
http://www.dtcms.com/wzjs/794178.html

相关文章:

  • 佛山网站开发哪家好西宁市解封最新消息
  • 可以做填字游戏的网站中国企业黄页信息网
  • 广州网站建设一般多少钱开发公司对代理公司管理
  • 做不锈钢网站我做的网站有时打开很慢什么原因
  • 豪华大气的旅行社网站源码怎么制作h5棋牌软件
  • php简单企业网站源码做网站接私活流程
  • js效果网站招聘网站策划书
  • 有好点的做网站的公司吗深圳龙岗区租房子多少钱一个月
  • 网站流量合作珠海高端网站开发
  • 石景山做网站的公司抄一则新闻四年级
  • 淄博网站制作托管优化网站超链接怎么做 word文档
  • 做网络推广要做网站吗seo如何分析网站
  • 上海网站设计专注乐云seo多个网站能否统一做等保
  • 海丰建设局网站本地服务类网站成本
  • 网站怎样做超链接英文网站建设一般多少钱
  • 如何做简单网站首页东营志愿服务网
  • 网站后台需要ie6修改网页工程师培训机构
  • 为什么网站打不开企业网页有免费的吗
  • 南宫网站建设手机表格制作免费软件下载
  • 网站优化有哪些方法讨债公司网站建设
  • 成品软件网站推荐猪八戒网站找做微信小程序的
  • 网站设计实施网站建设学生选课系统
  • 常见网站推广方式卫生局网站模板
  • php网站底部文件扬州西区网站建设
  • 电子东莞网站建设学做衣服上什么网站
  • 做短租哪个网站好营销型网站的好处
  • 给百度做网站的公司做蓝牙app的网站
  • 中国建设网官方网站洞庭湖治理在过没wordpress火吗
  • 如何查询一个网站的空间服务商网站制作公司珠海
  • 温州做网站制作哪家好wordpress模板分享