写入冲突的日志意思不明白

为提高效率,提问时请尽量提供详细背景信息,问题描述清晰可优先响应。以下信息点请尽量提供:

  • 系统版本 & kernel 版本:
  • TiDB 版本:2.1.15
  • 磁盘型号:
  • 集群节点分布:
  • 数据量 & region 数量 & 副本数:
  • 集群 QPS、.999-Duration、读写比例:
  • 问题描述(我做了什么):
    遇到以下报错:
    [2019-09-10 15:52:51,178] {bash_operator.py:165} INFO - ERROR 1105 (HY000) at line 692: Batch DML failed, please clean the table and try again. [try again later]: WriteConflict: txnStartTS=411068515856678913, conflictTS=411068519985446932,
    key={tableID=8048, indexID=2, indexValues={001809709828033000008450, 3089317146, }}
    primary={tableID=8048, indexID=1, indexValues={changan_park, CAASY01, 001603709829039700001692, CURRENTTESTINFO, 1, 20190910133406, }}

想请教这里的 key 和 primary 分别是什么具体的意义?两者有必然的关系吗

以下是找到的一些源码解释,不是非常理解:

Prewrite是事务两阶段提交的第一步,其从pd获取代表当前物理时间的全局唯一时间戳作为当前事务的 start_ts,尝试对所有被写的元素加锁(为应对客户端故障,tidb 为所有需要写的key选出一个作为primary,其余的作为secondary),将实际数据存入 rocksdb。其中每个key的处理过程如下,中间出现失败,则整个prewrite失败:
检查 write-write 冲突:从 rocksdb 的write 列中获取当前 key 的最新数据,若其 commit_ts 大于等于start_ts,说明存在更新版本的已提交事务,向 tidb 返回 WriteConflict 错误,结束。

原因: 写冲突报错,key 和 primary 是指 prewrite 定义的 primary key,key 代表冲突的行。 解决办法 通过这里面的 tableid,indexid 以及 values 可以定位到具体的 row,然后从业务逻辑判断冲突原因。

感谢!我看了一下这个key
key={tableID=8048, indexID=2, indexValues={001809709828033000008450, 3089317146, }}
其中 3089317146 这个值不属于任何一个字段。从 001809709828033000008450 这个字段查了一下,有13条记录。感觉没有什么帮助。
另外通过 primary 可以查出一条记录。但到底是哪行数据冲突了,还是没办法判断。是Primary这条记录吗?

001809709828033000008450, 3089317146 是索引的两个字段。

然后是 key 的这行冲突了。

mark

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