96SEO 2026-02-20 01:41 10
三种情况导致Jvm本地锁失效1、多例模式下Jvm本地锁失效2、Spring的事务导致Jvm本地锁失效3、集群部署导致Jvm本地锁失效

mysql锁演示1.7.1、一个sql1.7.2、悲观锁1.7.3、乐观锁1.7.4、mysql锁总结
库存在并发量较大情况下很容易发生超卖现象一旦发生超卖现象就会出现多成交了订单而发不了货的情况。
场景商品S库存余量为5时用户A和B同时来购买一个商品此时查询库存数都为5库存充足则开始减库存
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.46/version/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.3.4/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesapplication.yml配置文件
spring.datasource.driver-class-namecom.mysql.jdbc.Driver
spring.datasource.urljdbc:mysql://192.168.239.11:3306/atguigu_distributed_lock
spring.datasource.passwordhouchenDistributedLockApplication启动类
MapperScan(com.atguigu.distributed.lock.mapper)
{SpringApplication.run(DistributedLockApplication.class,
stockService;GetMapping(stock/deduct)public
deduct(){this.stockService.deduct();return
this.stockMapper.selectById(1L);//
0){stock.setCount(stock.getCount()
1);this.stockMapper.updateById(stock);}}
使用jmeter压力测试工具高并发下压测一下添加线程组并发100循环50次即5000次请求。
使用jvm锁synchronized关键字或者ReetrantLock试试
this.stockMapper.selectById(1L);//
{stock.setCount(stock.getCount()
1);this.stockMapper.updateById(stock);}}重启tomcat服务再次使用jmeter压力测试效果如下
添加synchronized关键字之后同一时刻只有一个请求能够获取到锁并减库存。
此时所有请求只会one-by-one执行下去也就不会发生超卖现象
原理StockService有多个对象不同的对象持有不同的锁所以还是会有多个线程进入到
this.stockMapper.selectById(1L);//
{stock.setCount(stock.getCount()
1);this.stockMapper.updateById(stock);}}
}重启tomcat服务再次使用jmeter压力测试查看数据库发现库存确实没有减到
this.stockMapper.selectById(1L);//
{stock.setCount(stock.getCount()
1);this.stockMapper.updateById(stock);}}
重启tomcat服务再次使用jmeter压力测试查看数据库发现库存确实没有减到
{this.stockService.deduct();}return
使用jvm锁在单工程单服务情况下确实没有问题但是在集群情况下会怎样
application/octet-stream;sendfile
3在post中测试http://localhost/stock/deduct
http://localhost:80/stock/deduct
每个服务都有自己的本地锁所以无法锁住临界区导致多线程的安全问题
{this.stockMapper.updateStock(1001,
this.stockMapper.queryStockForUpdate(1001);if
{stocks.setCount(stocks.getCount()
1);this.stockMapper.updateById(stocks);}}在StockeMapper中定义selectStockForUpdate方法
queryStockForUpdate(Param(productCode)
注意测试之前需要把库存量改成5000。
压测数据如下比jvm锁性能高很多
【注意】使用MySQL乐观锁时也需要注意锁的粒度尽量使用行级锁否则系统吞吐量会降低
乐观锁是相对悲观锁而言乐观锁假设认为数据一般情况下不会造成冲突所以在数据进行提交更新的时候才会正式对数据的冲突与否进行检测如果发现冲突了则重试。
字段来实现。
当读取数据时将version字段的值一同读出数据每更新一次对此version值加一。
当我们提交更新的时候判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对如果数据库表当前版本号与第一次取出来的version值相等则予以更新。
this.stockMapper.selectById(1L);//
stock.getVersion();stock.setCount(stock.getCount()
1stock.setVersion(stock.getVersion()
(this.stockMapper.update(stock,
{deduct();}}}重启后使用jmeter压力测试工具结果如下
并发度比较低说明乐观锁在并发量越大的情况下性能越低因为需要大量的重试并发量越小性能越高。
高并发情况下性能较低ABA问题读写分离的情况下可能会导致乐观锁不可靠
如果追求极致性能、业务场景简单并且不需要记录数据前后变化的情况下。
如果写并发量较高一般会经常冲突此时选择乐观锁的话会导致业务代码不间断的重试。
https://blog.csdn.net/hc1285653662/article/details/127564372
为了提高请求响应的速度将库存放在redis中进行操作*/public
redisTemplate.opsForValue().get(stock:
{redisTemplate.opsForValue().set(stock:
jmeter启动测试可以看到并发比无锁时候的mysql库存要高
使用watch命令监视某个key如果在监视的过程中该key被某个客户端修改后那么自身对于key的修改将会失败
为了提高请求响应的速度将库存放在redis中进行操作*/public
stock:1001redisTemplate.execute(new
operations.opsForValue().get(stock:
{operations.multi();operations.opsForValue().set(stock:
{e.printStackTrace();}deduct();}return
null;}});}查看测试结果发现并发很低可能因为我redis部署在阿里云上的docker里网络开销导致并发很低但是确实解决超卖问题
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback