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

如何做登陆界面的网站百度关键词点击工具

如何做登陆界面的网站,百度关键词点击工具,网站建设的市场策划,注销公司要花多少费用什么是超卖?假如只剩下一个库存,却被多个订单买到了,简单理解就是库存不够了还能正常下单。 方案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/a/549176.html

相关文章:

  • linux-centos开机自动执行脚本
  • java面试题(没有答案)
  • 浏览器端实时语音采集 + WebSocket 传输 + 后端 Whisper + GPT 翻译 + 实时字幕返回
  • 亚马逊巴西拓宽当日达覆盖区域,配送门槛大幅下调
  • 《UniApp 安全区适配与自定义导航栏全攻略》
  • 邯郸住房及城乡建设部网站有专门做ppt的网站有哪些
  • Spring Boot3零基础教程,Lambda 表达式的使用,笔记96
  • Rust入门开发之Rust 语法中函数基本形式详解
  • 【机器学习】管道化与自动化建模
  • LangChain Few-Shot Prompt Templates(two)
  • Spring Al学习3:Prompt
  • 网站优化外链贵州互联网公司
  • 宿迁做网站哪家好做网站要注意哪些
  • 打造属于你的 Telegram 中文版:汉化方案 + @letstgbot 搜索引擎整合教程
  • web--请求响应、分层解耦
  • 做进化树的在线网站东莞软文推广
  • 从零开始的云原生之旅(八):CronJob 实战定时清理任务
  • Python自动化测试 | 快速认识并了解pytest的基本使用
  • 网站备案增加域名天津招聘网人才招聘官网
  • 有什么做外贸的好网站直播网站app下载
  • seo网站改版方案怎么写如何做网站内部优化
  • 找婚庆公司去什么网站亚马逊雨林动物大全
  • 基于百度地铁 API 的长沙地铁站点详情查询与路线导航实践
  • C# 继承
  • Ubuntu 24.04 从源码编译 dcgm-exporter
  • 【软件测试基础】详解数据库核心操作:增删改查,及测试关注点
  • 建网站服务厦门市建设路网站
  • 大模型-多模态机器学习
  • JavaSE基础——第十三章 泛型
  • 从传统到未来:Java在现代开发中的新价值与进化方向