表写入遇到 primary lock 问题

【 TiDB 版本】

  • v7.1.3

【遇到的问题】

1、有一个业务表逻辑比较简单,并发读的概率不高,就是先 redis上锁 然后查询是否有数据,有数据就update 没数据就 insert。但是日志经常报错锁冲突 Key is locked (will clean up) primary_lock

2、这个表的结构如下,主键由三个字段组成:

CREATE TABLE `test` (
  `type` tinyint(3) unsigned NOT NULL,
  `post_id` int(10) unsigned NOT NULL,
  `device_type` tinyint(3) unsigned NOT NULL,
  `pv` int(10) unsigned NOT NULL,
  PRIMARY KEY (`type`,`post_id`,`device_type`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin'

3、查看 TIKV_REGION_STATUS 表看到 region 总共有 55 个,但是 PRIMARY 类型的 region 只有1个,怀疑是不是因为这里面的 region 统计信息不准确导致经常出现 primary_lock 的情况

primary 的 region 数量:

https://docs.pingcap.com/zh/tidb/stable/troubleshoot-lock-conflicts 看看这个呢。 :thinking:

  • 监控中出现少量 txnLock,无需过多关注。后台会自动进行 backoff 重试,单次初始 100 ms,单次最大 3000 ms。
  • 如果出现大量的 txnLock,需要从业务的角度评估下冲突的原因。
  • 使用悲观锁模式。

这个表并发不高的

对业务有实际影响吗? 如果 backoff 时间不是很长,这种可以忽略的

有数据就update 没数据就 insert 这里具体是怎么实现的,select for update了吗