2016年7月8日,周五,本来一个欢快的日子,大家准备去吃会火锅唱会歌,下班前DBA同学发现突然有几个更新语句在query中,一直无法执行完,更新的语句基本是针对同一条更新的,语句的大概意思就是在交易完成后更新一条出库的记录,对已售数字进行加一,称之为SQLA;
分析开始
1.这个表很小,大概300条,执行sql中有索引,应该很快就执行完成,并且这段代码已经在线上安然度过半年多,先排除代码问题,转向是否被攻击
2.线上服务器对于交易接口进行了监控,请求数量很少,和阻塞的数量基本保持一致
3.再回到代码分析,交易目前是一个比较大的事务,事务中包含了:资产扣除,商品出库,第三方API(流量商品)发起订单请求并等待响应。整体操作中只有更新商品的兑换数量也就是SQLA会发生行锁的问题。
那么对于同一个商品品项如果事务A中SQLA之后的某个地方发生等待或阻塞,导致事务A无法完成,一直持有SQLA当时执行的行锁, 如图
[img]
[/img]
截至目前,应该可以定位到第一个问题,大量SQLA阻塞的问题,同一个商品交易,有一个事务存没有及时完成,导致此商品兑换一直处于阻塞的状态,而且根据mysql的特性,SQLA执行的表会拖慢整个数据库的性能。
那么是什么导致了某一个事务没有完成?大家的研究齐刷刷的看向了第三方API,会不会是这个玩意引起的,分别在再服务器日志中查看了一下这个api最近调用的日志记录,其中有一个线程,调用过之后一直没有再返回。。。。就这样默默的抛弃了我们,基本锁定是api的调用响应迟迟不来,导致整个事务无法结束,SQLA无法释放行锁,其他事务也不能完成,以此类推完成了这次晚上的超级大bug;
待解答问题:
1,api调用时通过java http 完成,超时默认应该是60秒,但是为什么没有超时需要进一步跟踪
2.api放在事务中确实需要剥离,具体方案稍后更新
- 大小: 21.3 KB
分享到:
相关推荐
当MySQL检测到死锁时,它会自动选择一个事务进行回滚以打破死锁循环。在上述案例中,问题出在一个`insert`语句上,该语句在尝试插入数据时遇到了死锁。通过`show engine innodb status;`命令,我们可以查看MySQL的...
- **上下文切换**:当多个进程或线程共享同一个CPU时,操作系统会不断地在它们之间切换,以便让每个进程都能得到一定的CPU时间。这种切换过程称为上下文切换。 - **运行队列**:指等待CPU时间的进程队列。一般认为,...
一个线上项目报的死锁,简要说明一下产生原因、处理方案和相关的一些点. 1、背景 这是一个类似数据分析的项目,数据完全通过LOAD DATA语句导入一个InnoDB表中。为方便描述,表结构简化为如下: Create table tb(id ...
本文将深入探讨如何通过调整索引来解决一个具体的线上死锁案例。 首先,让我们看下表`t3`的创建语句和数据插入: ```sql CREATE TABLE `t3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` varchar(5), `b` ...
一个线上项目报的死锁,简要说明一下产生原因、处理方案和相关的一些点.这是一个类似数据分析的项目,数据完全通过LOADDATA语句导入一个InnoDB表中。为方便描述,表结构简化为如下:Createtabletb(idintprimarykey ...
3. **锁机制问题**:死锁是导致CPU飙升的一个重要原因。MySQL的InnoDB引擎支持事务和行级锁,不正确的锁策略可能导致死锁。通过`jstack`分析,若发现"deadlock"关键字,说明存在死锁,需要检查事务的执行顺序和锁的...
一、生产环境MySQL死锁如何监控及如何减少死锁发生的概率 首先,死锁并不是”锁死”,死锁是由于两个或两个以上会话锁等待产生回路造成。 (一)死锁监控及处理方法 对于死锁的监控,各个版本都提供了innodb_print_...
这个问题考察的点: 线上高并发下的添加大表建索引 当表数据量很大时,建立索引或者修改表结构会很慢,而且在操作的过程中,数据库甚至处于死锁状态,那么有没有其他的好的办法呢? 方式1、“影子策略” 创建一张...
MySQL通过死锁检测和回滚其中一个事务来解决这个问题。通过合理设计事务逻辑和避免长时间持有锁,可以减少死锁的发生。 5. **索引优化** 索引可以极大地提高查询速度,减轻锁竞争。正确使用主键、唯一键和覆盖索引...
+ 依赖倒置原则:一个类,不应该强依赖另外一个类 + 配置化:尽可能的使用配置,而不是硬编码 + 面向接口编程:只需要关心接口,不需要关心实现 * PHP 的 GC 垃圾回收 * PHP-FPM 和 Nginx 的关系,CGI,Fast-CGI...
MySQL在检测到死锁后会自动回滚其中一个事务(在这种情况下是事务(2)),以打破循环等待并结束死锁。但是,为了预防死锁,可以采取以下策略: 1. **事务排序**:确保事务操作的顺序是一致的,例如,所有事务都...
- **禁止使用外键**:外键可能导致表间耦合,影响UPDATE和DELETE操作的性能,可能引发死锁,应由应用程序来控制外键完整性。 4. **字段设计规范** - **字段定义为NOT NULL并提供默认值**:NULL字段会增加索引和...
王者荣耀java源码 标题 分类 内容 备注 ...MYSQL线上死锁问题分析 SQL MYSQL内存泄漏 架构 架构 架构 分布式 二维码生成问题实例 分布式 锁造成线上安全事故 算法 LRU算法实际使用 设计模式 设计模式
另外,当队列满而核心线程和扩展线程都空闲时,面试者被问及谁会从队列中获取任务,这个问题涉及到线程池的管理策略。 JUC(Java并发工具包)是面试的另一个重点,面试者解释了为什么线程池需要先创建coreSize大小...
2. 角色(Role):方便权限管理,将一组权限分配给一个角色,用户可以被授予角色来获取权限。 3. 视图(View):提供安全访问数据的另一种方式,限制用户查看特定数据。 在面试和笔试中,除了上述知识点,面试官还...
InnoDB是MySQL的一个事务型存储引擎,支持ACID特性,具有行级锁定和外键约束。它是默认的存储引擎,适合处理大量数据并需要事务安全的应用场景。InnoDB使用自适应哈希索引、MVCC(多版本并发控制)来提高并发性能,...
1. 分析问题与解决思路:如何处理线上问题,如何优化性能,如何进行代码审查。 2. 代码质量:良好的编码习惯,遵循编码规范,编写可读性强、可维护的代码。 3. 项目管理:理解敏捷开发,Scrum或Kanban方法,版本控制...