关于 Project4B 中遇到的一些疑惑

  1. 感觉 tinyky 里面没有凸显 primary key 的作用。按照论文来说,commit 应该是先检查 primary key lock 的状态,但是这里我没有实现也能过。
  2. KvCommit() 中如果发现 key 的 lock 不存在,应该直接报错,因为这种情况按照道理不应该出现,而按照测试用例来说还必须要返回不带错误的 CommitResponse,那不是还意味着这个请求是成功的了?
  3. KvCommit() 中如果发现 key 的 lock 的 ts 和当前事务的 startVersion 不同,为什么是返回 Retryable,想不通。我甚至觉得这种情况都不会发生,因为它在 KvPrewrite() 阶段就应该被终止了,怎么还会到 KvCommit() 阶段?

关于问题2,3,也许存在一种错误的场景我没有想到,请大佬们说下。

1 个赞

说一下我的理解吧,不一定对,大家讨论一下。

  1. 请问这是在kvCommit函数中吗?在这个函数中,需要遍历每个Key,判断lock。如果不判断,是会报错的。

我感觉在这个项目中,primaryKey不用特意说明。因为遍历检查每个Key的时候,它的锁都是指向primaryKey的锁信息。preWrite中放入的锁信息是这样的 PutLock(key, PrimaryKeyLock)

  1. 在调用 kvCommit() 的时候,可能之前已经提交过了,这个时候寻找 lock,就应该是不存在的。

  2. 比如说,kvPrewrite() 是成功的,但在 lock 中会有一个 Ttl,有可能是当前事务的锁Ttl超时,(其他事务获得锁),造成当前事务的锁暂时没有了,提交不成功,需要重试。