# [Critical bug] 副本读无法保证事务一致性

## Issue

使用了 async commit 或 1PC，且开启了 follower read 特性或是启用了 TiFlash 的情况下，读取可能无法保证事务一致性。

可能出现：

1. 已提交的事务写入无法被立刻读取到。

2. 事务内读取不满足可重复读。

内部 Jepsen 测试中发现了这个 bug：[https://github.com/pingcap/tidb/issues/32800](https://github.com/pingcap/tidb/issues/32800)

## Root Cause

进行副本读时，需要将读取范围和时间戳携带在 read index 请求中发送给 leader，以使其与 async commit 和 1PC 兼容。

如果原 leader 在收到检查请求时已变成 follower，它会将 read index 转发给新 leader，但其中缺少了读取范围和时间戳，导致相关检查没有能够生效，使副本读有可能读到稍旧的数据。

## Diagnostic Steps

1. 业务上可能发现事务一致性问题。

2. 索引读或 admin check table 可能出现临时性的报错。

## Resolution

升级 TiKV 至修复了该 bug 的版本。

Bug fix PR: [https://github.com/tikv/tikv/pull/12115](https://github.com/tikv/tikv/pull/12115)

预期修复版本：5.0.7, 5.1.5, 5.2.4, 5.3.2, 5.4.1, 6.0.0

## Workaround

以下两者均可：

1. 不使用 follower read 和 TiFlash.

2. 不使用 async commit 和 1PC.
