对 MySQL 死锁不是特别擅长,业务中遭遇了,就尝试分析一下了。
业务需求,写出了类似这样的 SQL:
1
2INSERT INTO site(third_party_id, data) VALUES(%s, %s)
ON DUPLICATE KEY UPDATE data = %s
其中 site 表主键 id 自增,唯一索引 third_party_id。
SQL 目的很简单,就是从一张三方表中导数据到自己业务的一张表中间。
就这样简单的一句 SQL,没有复杂的事务,只是会出现大量的并发。
并发跑起来之后,很快就会发现程序报出大量死锁,看下死锁记录,可以抓到一条死锁信息大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24*** (1) TRANSACTION:
TRANSACTION 4185716323, ACTIVE 0.021 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1184, 3 row lock(s)
LOCK BLOCKING MySQL thread id: 2