乐观锁下写写冲突导致慢sql

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
乐观事务下写写冲突导致的update或insert慢(耗时几秒,修改的内容不多,走索引修改),只能降低并发,把并行改串行来解决吗?如果不使用悲观事务,还有其它办法吗?
现在并发并不高,也就几个并发。
tidb_disable_txn_auto_retry 重试会导致数据丢失,自动重试不行。

慢查询日志里有txnLock:
Prewrite_time: 4.738867105 Wait_prewrite_binlog_time: 0.000000467 Commit_backoff_time: 4.736 Backoff_types: [txnLock txnLock txnLock txnLock txnLock] Resolve_lock_time: 0.000006231 Write_keys: 9 Write_size: 793 Prewrite_region: 3

tidb 日志里有Write conflict
[2023/08/21 21:48:03.278 +08:00] [WARN] [session.go:425] [sql] [conn=747870656] [label=general] [error=“[kv:9007]Write conflict, txnStartTS=443711666075730001, conflictStartTS=443711667071877217, conflictCommitTS=443711667071877226, key={tableID=1765, handle=436418090659116} primary={tableID=1765, indexID=7, indexValues={180357100, 1, 1, 1692625676, 436418090659116, }} [try again later]”] [txn=“Txn{state=invalid}”]


文档上写应用程序修改逻辑,需要怎么修改逻辑呢?
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

Hi~你的版本太低了,建议升级为高版本哟~
很多低版本的问题高版本已经修复了~
你就不用苦苦挣扎了!

1 个赞

https://docs.pingcap.com/zh/tidb/stable/troubleshoot-write-conflicts#乐观事务模型下写写冲突问题排查 参考这里排查问题。
参考这里最佳实践 TiDB 最佳实践系列(三)乐观锁事务 | PingCAP

从 TiDB v3.0.8 版本开始,新创建的 TiDB 集群会默认使用悲观事务模式,悲观事务中的当前读(for update 读)为不可重复读, 或者如表妹所说,升级Tidb版本 也可以利用新特性 规避掉很多问题

写写冲突在高版本也有吧,现在可以确定是有写写冲突,我上面的截图就是这个链接的7.1的文档,文档上写的 “看是否能从应用程序修改逻辑” ,是怎么修改逻辑呢?把并发改成串行吗?
因为是从老版本升上来的,所以参数还是乐观事务,如果我现在全局改成悲观事务,是不是会对现有业务影响很大啊?(业务通过中间件连的tidb,中间件不支持会话级别修改参数)

对,当你从老版本升级之后,不会自动开启,需要你手动开启,开启前你可以先熟读一下问题,
社区中有些相同的问题,你也可以看看别人的答案。

我理解从应用侧解决的意思:是把锁放在db外,比如通过redis/zookeeper来做锁。保证进db的时候没有冲突。

个人见解。

https://docs.pingcap.com/zh/tidb/stable/constraints#乐观事务

https://docs.pingcap.com/zh/tidb/stable/dev-guide-optimistic-and-pessimistic-transaction#乐观事务和悲观事务

你都可以看看

乐观锁用的情况应该是基本不存在冲突的

是否改过事务隔离级别尼

我们这边之前的情况类似,从低版本升级上来的,一直是用的乐观锁,锁冲突很严重,改成悲观锁问题解决了,需要注意下改完重启下应用。