# [Critical bug] 一个明显的TiDB GC错误，可能导致交易的原子性被破坏

## Issue

上周发现了 TiDB GC meet region merge 时缺少 resolve locks 的关键 bug，这会导致事务的原子性被破坏，可能导致数据索引不一致或数据丢失。 错误现象：

事务中写入的部分数据丢失：

如果发生数据或索引丢失，用户可能会看到错误：

错误 8021：不一致的额外索引 PRIMARY..

错误 1105：无法复制行，因为找不到旧行...

错误级别的输出可能会在日志中看到： -2PC 提交主键后提交键失败

需要查看mvcc / tidb gc-related log / tikv region merge相关日志来再次确认GC运行时是否发生region merge。

### 触发条件

TiKV 区域合并已启用。

在 GC worker 处理当前区域期间，下一个区域被合并到当前区域

下一个区域的锁可能丢失解决，这些锁有机会成为某些的二级锁 事务，如果是这样，GC worker 可能是 gc primary 而不解决那些辅助锁。

### 受影响的版本

v3.0.19 ~ v3.0.20 v3.1.x v4.0.5 ~ v4.0.9

Github： <https://github.com/pingcap/tidb/issues/22245>

## Root Cause

为了减少由于区域缓存未命中导致的重复重新扫描，#22245 尝试在重新扫描之前添加额外的检查，当所有扫描的锁都在新获取的区域中时，它将避免重新扫描，但是当区域合并发生时，#22245 的逻辑将在已合并到当前区域的下一个区域中丢失句柄锁。

## Diagnostic Steps

N/A

## Resolution

修复版本： v3.0.21 v4.0.10, v5.0.0.rc

修正： <https://github.com/pingcap/tidb/pull/22252>

## Workaround