Insert语句的锁是持有的行锁吗?前序执行时间很长

【TiDB 使用环境】生产环境 /测试/ Poc
有一条SQL前序执行时间很长40多秒。同一时间这个表有大量的insert语句。这是个长事务,事务期间会调用三方接口,三方接口耗时有点长。这种该如何排查前序执行期间锁是什么锁?行锁还是表锁?

time:50.1s, loops:2, prepare: 23.4µs, insert:42.3µs, lock_keys: {time:50.1s, region:2, keys:2, resolve_lock:105ms, lock_rpc:49.946036237s, rpc_count:50}
1 个赞

tidb一般都是行锁,但是有事务冲突情况加锁解锁都比较慢

那前序执行时间是行锁等待时间吗?

行锁。但是肯定会先加表锁

比如select for update,会在条件行加锁。表上再加锁。

排查锁类型可通过 TiDB 内置工具直接查看事务锁信息,核心步骤有 3 点:

  1. show processlist 找到长事务的 ID,或在 TiDB Dashboard 的 “事务” 页面定位该事务;
  2. 执行 select * from information_schema.tidb_trx where trx_id = '事务ID';,查看 lock_mode 字段(ROW 为行锁,TABLE 为表锁);
  3. 若需更详细锁信息,执行 select * from information_schema.tidb_locks where trx_id = '事务ID';,可看到具体锁表、锁行的 primary key 及锁类型。

也可能是间隙锁吧,直接锁表那性能不是太低了吗

tidb没有间隙锁

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。