使用TIKV client.go客户端 txn方法删除key后,在scan prefix还能查到?

TIKV的client.go客户端调用Delete方法删除一个key ("$uat-zmc-xxxxxx")

func (txn *KVTxn) Delete(k []byte) error {
	return txn.us.GetMemBuffer().Delete(k)
}

然后通过scan方法查 prefix 为 “$” 的数据还是可以查到刚刚删除的key。

func scanKeys(prefix []byte, tx *tikv.KVTxn) [][]byte {
	it, err := tx.Iter(prefix, nextKey(prefix))
	if err != nil {
		panic(err)
	}
	defer it.Close()
	var ret [][]byte
	for it.Valid() {
		ret = append(ret, it.Key())
		if err = it.Next(); err != nil {
			panic(err)
		}
	}
	return ret
}

delete的时候已经commit了事务:

if !tx.IsReadOnly() {
		tx.SetEnable1PC(true)
		tx.SetEnableAsyncCommit(true)
		err = tx.Commit(context.Background())
	}

请问下这种情况是为什么?是只删除了MVCC里面的最新版本?
需要怎么才能完全删除这个key?

delete 就是追加了一条记录,完全删除要等到 compaction 之后

你肯定会问,compaction 什么时候会触发,来看这个文档

如果你是 5.4 之后的 tikv 版本,是支持手动 compation 的,如果是测试环境,可以搞搞
https://docs.pingcap.com/zh/tidb/v5.4/tikv-control#手动-compact-单个-tikv-的数据

感谢~

有个疑问,追加数据覆盖这个逻辑理论上不应该影响scan、get这类的查询吧,compaction不做也就不释放内存,这个可以理解,但是标记删除肯定是有做的吧~

tidb 4.0.x 好像修复了 Seek 时,跳过标记为 Delete 的数据,我忘记具体哪个版本修复了

目前用的TIKV是 5.0.6 版本的~~
client-go版本是 v2.0.1~~
还是有点疑惑为什么还是可以scan到已经(txn)delete的数据~

嗯,那就是 标准的 tidb 的处理方式修复了,然后不包括 RawAPI 和 TxnAPI :rofl:

看来需要自行处理了…

好的,thx~~

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。