# [Critical bug] 在 evict leader 还没结束的时候就进行关闭或重启 TiKV 操作有可能会破坏事务

## Issue

我们最近在 oncall 中发现一个严重 bug：如果在 evict leader 还没结束的时候就进行关闭或重启 TiKV 操作有可能会破坏事务。当相关 key 被查询时，有可能报错：

```golang
other error: default not found: key:7480000000000000175F72800000000000EADE, maybe read truncated/dropped table data?
```

触发条件 有并发事务访问同一个 key 且并发事务都已经在 TiKV 排队 TiKV 在没有完全迁移完 leader 的时候被关闭

## Root Cause

事务的正确性基于对相同 key 的并发控制。在 TiKV 关闭时，所有回调不管是否已经被 committed 都会被调用返回错误。这会让并发控制错误以为上个事务已经结束并开始调度下一个 command。更详细的说明可见这里。

## Diagnostic Steps

N/A

## Resolution

修复 PR: [https://github.com/tikv/tikv/pull/10364](https://github.com/tikv/tikv/pull/10364)

预期修复的版本: v5.0.3, v4.0.14, v3.0.20

## Workaround

临时规避方法： 等到 evict leader 结束再关闭 TiKV。tiup 1.5.2 已经将默认超时从 300 秒调整为 600 秒。生产中最好设置成一个符合经验的安全值。 如果条件允许，可以先把写入停了再关闭或重启 TiKV。
