Wirte conflict error [try again later]) for query 'COMMIT'

往tidb里并发写入数据时,出错: FATAL: mysql_stmt_execute() returned error 9007 (Write conflict, txnStartTS=412813234754027793, conflictStartTS=412813234754027779, conflictCommitTS=412813234754027846, key={tableID=52, handle=255920693} primary={tableID=52, indexID=1, indexValues={164151705, 255920693, }} [try again later]) for query ‘COMMIT’

并发线程:64 TiDB版本:tidb-v4.0.0-alpha centos7.5 单机版 非集群环境

写冲突错误,表示在 commit 阶段有其他事务也在修改相同的 key。

另外如果为以后上线做准备,建议使用3.0 release 版本做测试,4.0版本 release 还需要一段时间。

你们的官方网站上安装时推荐用的就是Latest的版本,装了以后就是最新的4.0的版本了。 如何避免在commit时有其他事务也在修改相同的key?这应该是高并发多线程写数据不可避免的情况, 那我现在这个问题怎么解决?

git clone -b $tag https://github.com/pingcap/tidb-ansible.git

这里的 tag 替换成最新 release 的版本。另外,在 inventory.ini 修改tidb_version 为最新 release 版本。

写冲突只能从业务逻辑层面来思考尽量减少写冲突,底层存储没有太好办法。

如果我要高并发量的做transaction, 比如64或100个线程并发做transaction,数据总量估计是400G,那用3.0的版本,会稳定吗?

这个问题目前貌似已经解决了 参考了你们官方的文档。

:+1:

怎么解决的?

进入数据库, 运行 set global tidb_disable_txn_auto_retry = off;

1赞

:+1:

感谢,明白啦!