我的物联网项目(二十七) 分布式锁粗心导致大量阻塞
有天项目中某个业务出现了异常,查询相关日志显示如下:
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
吓了大跳,居然还有锁时间过长导致后面的业务等待时间较长断开连接抛异常,看了下数据库控制台基本全黄,都是些执行时间较长正在执行的进程。
里面详细的SQL,继续点进去看看执行计划
从执行计划上看,扫码行数其实并不多的,所以还要从具体的业务场景去分析问题。
找到执行这条SQL的业务代码,了解当时的业务场景:
t_affairsevent事件表
简单描述下,这个事件表是用来做分布式事务,利用分布式调度来轮询,然后处理相关业务,具体可以看前面写过 我的物联网项目(八) 简单分布式调度,前面有讲到过利用setNX()来实现分布式锁,每次通过setNX()同一个标识,比如id来抢占锁,前面的业务场景没有问题,但是在这个业务场景里面问题来了,因为同时3个调度来分别执行id为1,2,3的3条记录都可以抢的到,然后都去执行如下SQL:
update t_partner_bymonth set .... where partnerId=10001 ,这样的话会导致多个SQL线程同时在执行同一记录,而且本身update就带锁行,所以导致执行速度巨慢甚至阻塞。
高并发update时,最先获得锁的会优先执行,其它几条处于行锁等待状态,等第一个执行完毕,行锁释放,由下一条语句获取锁进行更新,当其它会话等待的时间达到innodb_lock_wait_timeout(默认是50秒),这些update就会断开,不再执行。
像这种业务场景,将锁标识换成partnerId就可以避免刚才那种情况。
我的物联网项目(二十七) 分布式锁粗心导致大量阻塞相关推荐
- 我的物联网项目(二十三) 统计数据优化
平台无论是城市合伙人,还是商家,都有大量的统计数据的需求,比如统计商家一个月的总金额收入,投币消费总金额,微信扫码消费总金额等.这块的优化也一直在做,大概分为这么几个阶段. 1.实时count统计订单 ...
- 【甄选靶场】Vulnhub百个项目渗透——项目二十七:Pinkys-Palace-2(LFI,端口敲震,ssh爆破,64位缓冲区溢出)
Vulnhub百个项目渗透 Vulnhub百个项目渗透--项目二十七:Pinkys-Palace-2(LFI,端口敲震,ssh爆破,64位缓冲区溢出) 靶场地址
- 物联网项目(二)初建团队
今年三月初也是机缘巧合下接触这个项目,说实话也是非常看好这个项目,以前做过企业级项目,互联网项目,但是物联网项目也是第一次接触,相关资料了解了下何为物联网,原来是物物相连的互联网,与传统行业相结合的互 ...
- spring项目使用redis分布式锁解决重复提交问题
场景演示 假设有一个录入学生信息的功能,为了便于演示,要求不能有重名的学生,并且数据库对应字段没有做唯一限制. @GetMapping("/student/{name}")publ ...
- 多级缓存分析篇(二) 常用分布式锁分析
上篇主要讲了日常经常使用的哪些redis包及其配置的差异,这篇对基于redis的分布式锁,主要分享下自定义锁和redisson锁的使用和分析. 1.(自定义)Redis分布式锁 对于redis来说,非 ...
- 项目演化系列--分布式锁
前言 项目初期的时候,一般会发布到一台主机上,当达到负载极限时,要想提升其性能,要么提升硬件,要么多台主机,然而成本上的花销,后者比前者便宜太多了,虽然便宜,但是却更加复杂. 大多数编程语言提供的各种 ...
- 我的物联网项目(二十一) 摇摇车三种消费模式和城市合伙人
我们的摇摇车支持三种消费模式: 1.投币 和传统摇摇车一样,通过一元的硬币来启动摇摇车,公司其实在做这个平台当时的初衷是不做投币的,只做app扫码,一来方便用户,毕竟这几年来流行各种扫码.二来做线上运 ...
- 我的物联网项目(二十九) 线上前期运营
说实话,线上运营不是我们的强项,公司的大部分人对线上的运营想法都有一箩筐,谈起线上运营的内容,都是神采奕奕,滔滔不绝,感觉钱就在眼前,触手可及.我自己也一度认为,平台有了用户,有了流量,做线上的任何内 ...
- 我的物联网项目(二十) 合伙人羊毛党
城市合伙人平台上线后,对于系统监控最关心的两个事情就是用户和订单,其中以订单最为重心.原因很简单,因为外面很多城市合伙人陆续加入进来,摇摇车的流量入口越来越大,新注册的app用户和启动摇摇车产生的订单 ...
最新文章
- rocketmq 组监听_最全的RocketMQ学习指南,程序员必备的中间件技能
- 设置应用图标badge(徽章)
- 【Netty】主从反应器 ( Reactor ) 多线程模型
- cocoJS配置文件:project.json
- Eclipse不给提示no default proposals
- MySQL 之group_concat_max_length Mac 版
- 结合使用slf4j和Logback教程
- php beast linux安装,windows centos php-beast 安装
- Arduino学习笔记-按钮控制LED实验
- java主类调用数组_用java编写在主函数中调用数组
- D3 Geographies
- vscode配置c 环境_SAST Weekly教你在macOS上用VS Code配置C/C++编程环境
- 虚拟机下面装XP系统、安装ensp的步骤及使用ensp过程中所遇问题的解决
- 智能电网数据资产的风险管理
- PCB设计经典资料学习汇总
- 惠普服务器优盘安装系统蓝屏,惠普u盘装系统出现蓝屏现象怎么解决
- canvas动画:黑客帝国_使用Canvas API进行动画处理-第3部分:重力和动态渲染
- 【2022-05-31】JS逆向之易企秀
- Oracle DB 备份和恢复的概念
- python短信验证码登录_玩转python之获取短信验证码
热门文章
- 凉宫春日的忧郁第一章
- PCIe扫盲系列博文连载目录
- mysql计算机二级电子教程_MySQL数据库程序设计(2019年版全国计算机等级考试二级教程)...
- [图文]symbian与uiq开发教程(转)
- 程序员的奋斗史(四十五)——大学断代史(九)——独自南下的岁月
- 星星下落_与星星共舞
- 裸辞接单第一个月的收入
- 爬虫及数据分析--当当网
- Codeforces Round #750 (Div. 2)E. Pchelyonok and Segments (数学+DP)
- Burp Scanner Report