为提高效率,提问时请尽量提供详细背景信息,问题描述清晰可优先响应。以下信息点请尽量提供:
- 系统版本 & 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 错误,结束。