# [KB] TiDB 执行 update 报错 index out of range

## Key Words

TiDB, panic, index out of range

## Description

v5.1.4 执行 update 语句时报错 index out of range \[4294967295] with length 1，并非每次执行该语句都报错，但报错的概率还是比较大。表现为 TiDB 日志中存在发生于 memdb 的 panic：

```golang
github.com/pingcap/tidb/store/tikv/unionstore.(*nodeAllocator).getNode(...)
        /home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/store/tikv/unionstore/memdb_arena.go:192
github.com/pingcap/tidb/store/tikv/unionstore.(*MemDB).getNode(...)
        /home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/store/tikv/unionstore/memdb.go:733
github.com/pingcap/tidb/store/tikv/unionstore.memdbNodeAddr.getRight(...)
        /home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/store/tikv/unionstore/memdb.go:765
github.com/pingcap/tidb/store/tikv/unionstore.(*MemDB).traverse(0xc048215c70, 0xc074bfaf90, 0x13, 0x13, 0x0, 0x60, 0x7fbc4cc25a48)
        /home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/store/tikv/unionstore/memdb.go:354 +0xd31
github.com/pingcap/tidb/store/tikv/unionstore.(*MemDB).GetFlags(0xc048215c70, 0xc074bfaf90, 0x13, 0x13, 0x3569680, 0x3b9f101, 0xc074a0bb60)
        /home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/store/tikv/unionstore/memdb.go:202 +0x52
github.com/pingcap/tidb/store/tikv/unionstore.(*KVUnionStore).HasPresumeKeyNotExists(0xc0005908b8, 0xc074bfaf90, 0x13, 0x13, 0x13)
```

## Root Cause

根本原因是 TiDB 中事务的 memdb 不是线程安全的，不支持并发读写。在问题的执行计划中，Update 下的 IndexHashJoin 支持并发，所以会出现 Update 算子在更新 memdb 的同时，SelectLock 算子在读取 memdb 内的数据，产生了 data race，读取到了不正确的 index，造成了 panic。

## Resolution

升级到未受影响版本

## Workaround

1. 设置 tidb_index_lookup_join_concurrency 为 1 可以 workaround 这个问题，但影响面比较大。

2. 目前影响较小的方式，建议类似有 Update 和 SelectLock 之间存在并行算子的执行计划，尝试改写避免。

## Affect Version

v5.0.0~v5.0.5

v5.1.0-v5.1.3

v5.2.0-v5.2.4

v5.3.0-v5.3.1