关于事务和锁的问题

版本4.x

看有关事务和锁的文章的时候,发现这样一句话,不是很明白,请指教!

对于读请求,遇到这类悲观锁的时候,不用像乐观事务那样等待解锁,可以直接返回最新的数据即可(至于为什么,读者可以仔细想想)

tidb 3.x 4.x 目前的隔离级别都是RR
问题:
对于读请求,乐观模式下,为什么要等待呢?
而悲观模式下,为什么可以不等待呢?

TiDB 支持的是 Snapshot Isolation 隔离级别,之前在乐观锁模式下,每个事务只能读到在事务 start timestamp 之前最新已提交的数据,如果一个事务读到了锁需要等到锁被释放才能读到值,原因是有可能这个锁所属的事务已经获取了 commit timestamp 且比读到锁的事务 start timestamp 小,而读事务应该读到写事务提交的新值。

4.0 版本中对事务进行了一些优化,实现了写不阻塞读,TiDB 在事务的 Primary Lock 里保存了 minCommitTs ,即事务提交时满足隔离级别的最小的 commit timestamp 。读事务读到锁时会使用自己的 start timestamp 来更新锁对应事务的 Primary Lock 里的该字段,从而将读写事务进行了强制排序,保证了读事务读不到写事务提交的值,从而实现了写不阻塞读。

1赞

非常感谢,primary lock这个字符串怎么组装的? 看到tikv节点有这些信息。

https://github.com/tikv/tikv/blob/3b234d02154d19e1c41230804a94b6c67758d1d0/src/storage/txn/commands/prewrite.rs 感觉像是这一段,您可以看看,其他人也帮忙确认下。