如何捕获TiKV报错 Txn(Error(Mvcc(Error(TxnLockNotFound

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】 我们的应用(golang实现)在使用TiKV组件存储kv时,由于业务逻辑的原因可能会遇到TxnLockNotFound,在查阅了问题出现的原因可能是由于写入慢导致的之后,我们决定如果遇到该错误就进行重试。但是目前无法在 github.com/tikv/client-go/v2/error 下面找到相应的错误描述。

【应用框架及开发适配业务逻辑】
并发写入tikv的某一行数据,如果出错就重试,结果出现TxnLockNotFound错误
【背景】

【现象】

【问题】 无法从应用侧获取TxnLockNotFound的错误类型

【业务影响】 无法对该特定错误进行重试

【TiDB 版本】TiKV v6.1.0

【附件】 Error(Txn(Error(Mvcc(Error(TxnLockNotFound { start_ts: TimeStamp(440892935474774075), commit_ts: TimeStamp(440892936274313253), key: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 1, 135, 151, 111, 70, 149, 238, 214, 132, 2, 168, 28, 0, 0] })))))', ‘details’: []}
通过pd-ctl工具验证确实事务的commit时间超过了lock的ttl 3s

在 TiKV 中,TxnLockNotFound 错误表示事务在执行时发现某个 key 的锁已经过期,但是该 key 的锁已经被其他事务删除了,导致事务无法继续执行。这种情况通常是由于写入慢导致的,可以通过增加 TiKV 的写入能力来避免该错误的发生。

在使用 TiKV 的 Golang 客户端 client-go 时,可以通过 IsErrNotFound 函数来判断是否为 TxnLockNotFound 错误。例如:

if client-go.IsErrNotFound(err) {
    // 处理 TxnLockNotFound 错误
    // 进行重试等操作
}

需要注意的是,TxnLockNotFound 错误可能会导致事务失败,因此在处理该错误时需要进行重试等操作,以确保事务的正确性。

感谢回复,我还有一个疑问,IsErrNotFound是统一表示这一类NotFound相关的错误吗,因为如果key找不到也是用的这个错误

golang 对错误的异常描述不够精准对吧,如果异常没捕捉到,大部分都是 panic :rofl:

这个得自己分析代码了…