mysql 漏洞排查_一次有趣的 MySQL 死锁排查过程

生产环境的所有数据库问题中,由于 SQL 问题导致的数据库故障是最为常见的,本文针对曾经负责的一个核心系统在上线新业务功能抛出了许多 MySQL 死锁导致事务回滚的异常,给出了详细的排查流程:

复现死锁出现的场景

分析死锁出现的原因

给出解决方案

复现场景

某天晚上,某核心应用在生产环境正在发布,突然线上大量报警,抛出的大量异常信息都是关于数据库死锁:

Deadlock found when trying to get lock; try restarting transaction

MySQL 数据库基础信息:

版本:Ali-RDS 5.6.16-log

数据库引擎:InnoDB

事务隔离级别:READ-COMMITED

去除业务中非重要字段,出现死锁异常的数据库表结构为:

CREATE TABLE `bs_customer_sass_product` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',

`gmt_create` datetime NOT NULL COMMENT '创建时间',

`gmt_modified` datetime NOT NULL COMMENT '修改时间',

`cpb_mc` varchar(256) NOT NULL COMMENT '产品说明',

`cpb_id` varchar(64) NOT NULL COMMENT '产品 Id',

`state` varchar(64) DEFAULT NULL COMMENT '状态',

`cpb_no` varchar(256) DEFAULT NULL COMMENT '产品订单号',

PRIMARY KEY (`id`),

KEY `idx_cpbId_cpbNo` (`cpb_id`,`cpb_no`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='sass 缓存'

bs_customer_sass_product 表中包含两个索引:主键索引和 idx_cpbId_cpbNo 由(cpb_id、cpb_no)字段构成的非主键联合索引。

你可能感兴趣的:(mysql,漏洞排查)