【开卷故意】记录一次高并发下的死锁解决思考过程
开卷故意,好久没写博客了,近期工作也挺忙的。
死锁距离我不遥远。最终还是在高并发时被我碰到了。
DeadLock Found!
虽然编程风格中会尽量避免死锁,可是还是被我碰上了。文章可能看不出来我在做什么事情。仅仅是记录自己的一个排除死锁的过程。
事情起源于两个联动的缓存+redis+异步数据库读写操作。
事务中的这句出现死锁:
DELETE FROM table WHERE FROM key = ‘helloworld’
当初的思考解除死锁的思路例如以下:
1)分析死锁模型,如果1,2 两个线程,如果A,B两个锁,通俗的说 :
1持有A锁。等待B锁 -- 2 持有B锁。等待A锁
于是掐这了,就瘫了。
2)继续思考,要真这么简单,也不好意思称自己project师了,实际开发中都是碰到死锁环。
什么意思呢?继续如果
1持有A。等B,
2持有B,等C,
3持有C。等A
Anyway,读者能够自己如果还有4。5,6。7...
3)继续思考,死锁出现,第一步肯定是重审自己的代码。这个时候一定要对使用的成熟的工具优先保持自信但要保留质疑的态度。怎么重审,记录我的过程
a,我们说代码越简洁,越不easy出错。所以,秉着DRY原则。也要消除反复的代码,能复用就绝对不看着行数而自得。
b。重构过后。一定是要数据层,逻辑层分离。不要在数据层包括逻辑处理。不要在逻辑层去做数据层做的事情。(这个时候会发现,脑中有设计模式思想和没有这个 概念的人是有非常大差别的)
c。回归正题,我代码中的死锁出现是高并发环境,存在热点区。在重构过代码后,肯定要对热点数据进行预处理,才进行异步写入数据库。
什么是热点区?我自己乱 叫的一个名字,就是非常多时候。日志也好,外来数据也好,非常多时候会出现300ms以内出现100条99%相似度的数据。
d,继续測试。发现死锁依然,马上建立新的缓存,推断究竟哪里出了问题。发现,逻辑并没有问题。
e,持着质疑工具的态度,检索使用的工具,高并发发生在异步读写数据库,那么既然逻辑没有问题,读写中操作的数据就不会有问题。那就是数据库这里的锁机制出 了问题。
阅读数据库锁机制文档,发现了事务操作中的页面锁和记录锁出了问题。
f,问题来了。既然是多线程。高并发,就不可能不让事务持有记录锁和页面锁。此时怎么办?
解决的方法。放弃根据索引删除,更新。改用主键进行删除更新操作。
g,測试。正常。
整个过程。看了非常多文档,当中,最实用的:
p=844
同一时候也会翻译一篇看到的高并发的国外文章。
【开卷故意】记录一次高并发下的死锁解决思考过程相关推荐
- mysql并发插入死锁_高并发下insert死锁 · Issue #ITUNR · baomidou/mybatis-plus - Gitee.com...
当前使用版本(必须填写清楚,否则不予处理) springboot版本:2.0.3.RELEASE mybatis版本:3.0.5 jdk:1.8 该问题是怎么引起的?(最新版上已修复的会直接close ...
- php电商交押金的逻辑,PHP高并发下抢购、秒杀功能的超卖问题
抢购.秒杀是电商系统比较常见的功能,高并发下一般需要解决两个问题: 高并发下数据库的压力 高并发竞争下出现超卖问题 对于第一个问题,一般可以通过缓存.分库分表.主从等可以解决,这儿主要说说超卖问题. ...
- 面试官:高并发下,如何保证分布式唯一全局 ID 生成?
欢迎关注方志朋的博客,回复"666"获面试宝典 前言 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结. 这篇文章就是给各位看官提供一个生成分布式唯一 ...
- 高并发下秒杀商品,你必须知道的9个细节
前言 高并发下如何设计秒杀系统?这是一个高频面试题.这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个 ...
- 高并发下的秒杀系统架构设计实战!
1.秒杀业务分析 正常电子商务流程 (1)查询商品: (2)创建订单: (3)扣减库存: (4)更新订单: (5)付款: (6)卖家发货: 秒杀业务的特性 (1)低廉价格: (2)大幅推广: (3)瞬 ...
- 面试官问我:什么是高并发下的请求合并?
作者 | why技术 来源 | why技术(ID:hello_hi_why) 从一道面试题说起 前段时间一个在深圳的,两年经验的小伙伴出去面试了一圈 ...
- PHP redis秒杀返回结果,php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
- php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
- 高并发下防止库存超卖解决方案
一.概述 目前网上关于防止库存超卖,我没找到可以支持一次购买多件的,都是基于一次只能购买一件做的秒杀方案,但是实际场景中,一般秒杀活动都是支持1-5件的,因此为了补缺,写了此文,方便自己之后使用. 二 ...
最新文章
- matlab通过“ideal_lp设计理想高通滤波器_常见低通、高通、带通三种滤波器的工作原理...
- 最好的编程名言,大家一起来共勉----转载
- git 怎么跟踪空目录
- monkey 运行时间怎么计算_基于STM32F103C8T6工控板利用定时器计算某段代码的运行时间...
- Linux如何查看所有用户和用户组信息(cat groups whoami)
- WordPress插件、Erphp loggedin汉化版插件、 异地IP登录自动禁封用户
- python进入高考-Python已进入小学教材将加入高考
- php 判断字符串中是否包含另一个字符串 strpos
- 一个实用的String实现类(C++)
- hdu 1209 clocks wrong answer 我的错误代码(没审好题唉,角度一样后,还要按小时排序。...
- sql经典题目(1)
- Pytorch/Caffe可以先转换为ONNX,再转换为TensorRT
- java三大框架介绍
- Win10系统IE浏览器设置代理上网的方法
- dot com过时了,个性域名“钱”景看好
- 三年内人人有FIL,FIL 世界零撸板块引发全球流量狂潮!
- 如何面对软件工程师考试?
- 智能摄像头在我们的家居生活中,主要包含哪些利弊?
- Pico VR 一体机初测
- 图的存储结构(邻接矩阵和邻接表)