【 TiDB 版本】
V7.1.2
【复现路径】
单表大量数据更新,两个简单update语句同时执行,报写冲突,设置得有set @@session.autocommit = 1;
【遇到的问题:问题现象及影响】
Write conflict, txnStartTS=445789926295863313, conflictStartTS=445789926020612100, conflictCommitTS=445789926308970497, key={tableID=1063399, tableName=ods_extend.qi_asr_result, handle=2933907}, originalKey=7480000000001039e75f7280000000002cc493, primary={tableID=1063399, tableName=ods_extend.qi_asr_result, indexID=2, indexValues={0, 2933907, }}, originalPrimaryKey=7480000000001039e75f6980000000000000020380000000000000000380000000002cc493, reason=Optimistic [try again later]
看这个异常,感觉是使用了乐观锁导致的问题,但我看了文档,TiDB中默认是使用的悲观锁,“使用悲观事务模式时,autocommit 事务首先尝试使用开销更小的乐观事务模式提交。如果发生了写冲突,重试时才会使用悲观事务提交。所以 tidb_retry_limit = 0
时,autocommit 事务遇到写冲突仍会报 Write Conflict
错误。” 我也看了我的tidb_retry_limit,这个值是10,我要如何才能解决这个问题?
我设置了这些参数:
SET @@SESSION.autocommit = 1;
SET @@SESSION.tidb_batch_insert = 1;
SET @@SESSION.tidb_batch_delete = 1;
SET @@SESSION.tidb_dml_batch_size = 1000;
SET @@SESSION.tidb_replica_read = ‘leader-and-follower’;
SET @@SESSION.tidb_mem_quota_query = 16073741824;
SET @@SESSION.group_concat_max_len = 102400;
SET @@SESSION.tidb_enable_paging = 1;
SET @@cte_max_recursion_depth = 11000;