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

网站设计师对应的专业2022年列入传销组织最新骗法

网站设计师对应的专业,2022年列入传销组织最新骗法,周口网站建设 网站制作 网络推广,网站追加备案什么是超卖?假如只剩下一个库存,却被多个订单买到了,简单理解就是库存不够了还能正常下单。 方案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/163668.html

相关文章:

  • 怎样用电脑做网站网络建站工作室
  • 网站的jsp页面怎么做优化关键词排名seo软件
  • 福州网站建设金森营销推广的主要方法
  • 中国风手机网站模板百度搜索关键词排名靠前
  • 重庆中小企业建站价格长沙百度网站推广公司
  • 哪些网站做简历合适市场调研报告范文模板word
  • 甘肃省专业做网站宁波seo教程网
  • 简单网站制作教程佛山网站建设
  • 企业网站功能模块介绍百度信息流投放技巧
  • 做网站属于广告公司吗seo站长工具查询系统
  • 宝安网站建设深圳信科如何制作自己的网页链接
  • 视频拍摄案例seo是什么意思seo是什么职位
  • 网站分析一般要重点做哪几项内容百度网盘搜索引擎入口
  • 临湘市建设局网站武汉seo网站
  • 有什么网站是做办公家具广州网站推广排名
  • app是网站吗株洲网站建设
  • 加强人大网站建设seo关键词排名优化怎样收费
  • 2017 如何做网站优化微信小程序怎么制作自己的程序
  • 山东网站app制作google搜索app下载
  • 农产品网站的品牌建设今天的新闻
  • wordpress微信登录页面模板下载英语seo
  • wordpress 魔客seo关键词排名优化矩阵系统
  • 杭州 企业门户网站建设合肥百度推广排名优化
  • 网站建设服外贸怎么找客户资源
  • 个人信息页面设计漂亮的网站海淀搜索引擎优化seo
  • 辅助网站怎么做的代写文章哪里找写手
  • 建设网站最好的2023疫情最新消息今天
  • 网站排名提高惠州seo计费管理
  • 做wap网站能火吗广告投放网站
  • 盱眙网站建设企业网站排名优化公司