锁冲突日志信息疑问

【TiDB 版本】v4.0.11

【问题描述】

锁冲突信息如下:
有的日志是 indexValues 这里是具体冲突的主键数据
有的表是handle 这个是什么意思?

[2021/04/01 10:45:33.185 +08:00] [INFO] [adapter.go:633] [“pessimistic write conflict, retry statement”] [conn=118637427] [txn=423951107869901542] [forUpdateTS=423951107869901542] [err="[kv:9007]Write conflict, txnStartTS=423951107869901542, conflictStartTS=423951107830580954, conflictCommitTS=423951108184473745, key={tableID=14249, indexID=1, indexValues={913067499520460951f292d05c65b4de, }} primary={tableID=14249, indexID=1, indexValues={913067499520460951f292d05c65b4de, }} [try again later]"]

[2021/04/01 10:45:33.589 +08:00] [INFO] [adapter.go:633] [“pessimistic write conflict, retry statement”] [conn=118644442] [txn=423951108289331304] [forUpdateTS=423951108289331304] [err="[kv:9007]Write conflict, txnStartTS=423951108289331304, conflictStartTS=423951108276225182, conflictCommitTS=423951108289331648, key={tableID=16332, handle=1214} primary={tableID=16332, handle=1214} [try again later]"]

TiDB 对每个表分配一个 TableID,每一个索引都会分配一个 IndexID,每一行分配一个 RowID,但如果表有整数型的 Primary Key,那么会用 Primary Key 的值当做 RowID,这里的 handle 就是 Primary key 的意思

image

CREATE TABLE ep_invest_count_sync (
id varchar(32) NOT NULL COMMENT ‘主键’,
data_status int(11) NOT NULL DEFAULT ‘1’ COMMENT ‘数据状态’,
create_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘新增时间’,
update_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘更新时间’,
dienterprise_count int(11) DEFAULT NULL COMMENT ‘直投企业计数’,
event_count int(11) DEFAULT NULL COMMENT ‘投资事件计数’,
found_count int(11) DEFAULT NULL COMMENT ‘管理基金计数’,
fund_external_count int(11) DEFAULT NULL COMMENT ‘对外投资基金计数’,
fund_manager_count int(11) DEFAULT NULL COMMENT ‘基金管理人计数’,
ipo_count int(11) DEFAULT NULL COMMENT ‘上市产品计数’,
merger_count int(11) DEFAULT NULL COMMENT ‘被并购计数’,
next_dynamic_count int(11) DEFAULT NULL COMMENT ‘进入下一轮计数’,
product_count int(11) DEFAULT NULL COMMENT ‘投资产品计数’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=‘投资机构计数中间表’

这个表的主键不是整数类型的。

不好意思,刚才解释有点问题,上面的 handle 应该是 rowid ,只有在表是整数主键时 handle 才能和主键等价:
(1) 第一个写冲突的是索引数据冲突,所以上面的 key 是 {tableID=14249, indexID=1, indexValues={913067499520460951f292d05c65b4de, } , 而唯一索引的编码格式为:


(2)第二个写冲突的是行数据,所以上面的 key 是 key={tableID=16332, handle=1214} ,而行数据的编码格式为:

1 个赞

好的,谢谢

:handshake:

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